Richard Dürr
Me gustaría cambiar el color del eje, así como las marcas y las etiquetas de valor para un gráfico que hice usando matplotlib y PyQt.
¿Algunas ideas?
jose kington
Como ejemplo rápido (utilizando un método ligeramente más limpio que la pregunta potencialmente duplicada):
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(range(10))
ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis')
ax.spines['bottom'].set_color('red')
ax.spines['top'].set_color('red')
ax.xaxis.label.set_color('red')
ax.tick_params(axis="x", colors="red")
plt.show()
Alternativamente
[t.set_color('red') for t in ax.xaxis.get_ticklines()]
[t.set_color('red') for t in ax.xaxis.get_ticklabels()]
Si tiene varias figuras o subgráficos que desea modificar, puede ser útil utilizar el administrador de contexto matplotlib para cambiar el color, en lugar de cambiar cada uno individualmente. El administrador de contexto le permite cambiar temporalmente los parámetros rc solo para el código sangrado inmediatamente siguiente, pero no afecta los parámetros rc globales.
Este fragmento produce dos figuras, la primera con colores modificados para el eje, los ticks y las etiquetas de ticks, y la segunda con los parámetros rc predeterminados.
import matplotlib.pyplot as plt
with plt.rc_context({'axes.edgecolor':'orange', 'xtick.color':'red', 'ytick.color':'green', 'figure.facecolor':'white'}):
# Temporary rc parameters in effect
fig, (ax1, ax2) = plt.subplots(1,2)
ax1.plot(range(10))
ax2.plot(range(10))
# Back to default rc parameters
fig, ax = plt.subplots()
ax.plot(range(10))
puedes escribir plt.rcParams
para ver todos los parámetros rc disponibles y usar la comprensión de listas para buscar palabras clave:
# Search for all parameters containing the word 'color'
[(param, value) for param, value in plt.rcParams.items() if 'color' in param]
trenton mckinney
- Para aquellos que usan
pandas.DataFrame.plot()
,matplotlib.axes.Axes
se devuelve al crear un gráfico a partir de un marco de datos. Por lo tanto, el gráfico del marco de datos se puede asignar a una variable,ax
que permite el uso de los métodos de formato asociados. - El backend de trazado predeterminado para
pandas
esmatplotlib
. - Ver
matplotlib.spines
- Probado en
python 3.10
,pandas 1.4.2
,matplotlib 3.5.1
,seaborn 0.11.2
import pandas as pd
# test dataframe
data = {'a': range(20), 'date': pd.bdate_range('2021-01-09', freq='D', periods=20)}
df = pd.DataFrame(data)
# plot the dataframe and assign the returned axes
ax = df.plot(x='date', color="green", ylabel="values", xlabel="date", figsize=(8, 6))
# set various colors
ax.spines['bottom'].set_color('blue')
ax.spines['top'].set_color('red')
ax.spines['right'].set_color('magenta')
ax.spines['right'].set_linewidth(3)
ax.spines['left'].set_color('orange')
ax.spines['left'].set_lw(3)
ax.xaxis.label.set_color('purple')
ax.yaxis.label.set_color('silver')
ax.tick_params(colors="red", which="both") # 'both' refers to minor and major axes
diagrama de nivel de ejes marinos
import seaborn as sns
# plot the dataframe and assign the returned axes
fig, ax = plt.subplots(figsize=(12, 5))
g = sns.lineplot(data=df, x='date', y='a', color="g", label="a", ax=ax)
# set the margines to 0
ax.margins(x=0, y=0)
# set various colors
ax.spines['bottom'].set_color('blue')
ax.spines['top'].set_color('red')
ax.spines['right'].set_color('magenta')
ax.spines['right'].set_linewidth(3)
ax.spines['left'].set_color('orange')
ax.spines['left'].set_lw(3)
ax.xaxis.label.set_color('purple')
ax.yaxis.label.set_color('silver')
ax.tick_params(colors="red", which="both") # 'both' refers to minor and major axes
trama de nivel de figura nacida en el mar
# plot the dataframe and assign the returned axes
g = sns.relplot(kind='line', data=df, x='date', y='a', color="g", aspect=2)
# iterate through each axes
for ax in g.axes.flat:
# set the margins to 0
ax.margins(x=0, y=0)
# make the top and right spines visible
ax.spines[['top', 'right']].set_visible(True)
# set various colors
ax.spines['bottom'].set_color('blue')
ax.spines['top'].set_color('red')
ax.spines['right'].set_color('magenta')
ax.spines['right'].set_linewidth(3)
ax.spines['left'].set_color('orange')
ax.spines['left'].set_lw(3)
ax.xaxis.label.set_color('purple')
ax.yaxis.label.set_color('silver')
ax.tick_params(colors="red", which="both") # 'both' refers to minor and major axes
motivado por colaboradores anteriores, este es un ejemplo de tres ejes.
import matplotlib.pyplot as plt
x_values1=[1,2,3,4,5]
y_values1=[1,2,2,4,1]
x_values2=[-1000,-800,-600,-400,-200]
y_values2=[10,20,39,40,50]
x_values3=[150,200,250,300,350]
y_values3=[-10,-20,-30,-40,-50]
fig=plt.figure()
ax=fig.add_subplot(111, label="1")
ax2=fig.add_subplot(111, label="2", frame_on=False)
ax3=fig.add_subplot(111, label="3", frame_on=False)
ax.plot(x_values1, y_values1, color="C0")
ax.set_xlabel("x label 1", color="C0")
ax.set_ylabel("y label 1", color="C0")
ax.tick_params(axis="x", colors="C0")
ax.tick_params(axis="y", colors="C0")
ax2.scatter(x_values2, y_values2, color="C1")
ax2.set_xlabel('x label 2', color="C1")
ax2.xaxis.set_label_position('bottom') # set the position of the second x-axis to bottom
ax2.spines['bottom'].set_position(('outward', 36))
ax2.tick_params(axis="x", colors="C1")
ax2.set_ylabel('y label 2', color="C1")
ax2.yaxis.tick_right()
ax2.yaxis.set_label_position('right')
ax2.tick_params(axis="y", colors="C1")
ax3.plot(x_values3, y_values3, color="C2")
ax3.set_xlabel('x label 3', color="C2")
ax3.xaxis.set_label_position('bottom')
ax3.spines['bottom'].set_position(('outward', 72))
ax3.tick_params(axis="x", colors="C2")
ax3.set_ylabel('y label 3', color="C2")
ax3.yaxis.tick_right()
ax3.yaxis.set_label_position('right')
ax3.spines['right'].set_position(('outward', 36))
ax3.tick_params(axis="y", colors="C2")
plt.show()
También puede usar esto para dibujar múltiples gráficos en la misma figura y diseñarlos usando la misma paleta de colores.
Un ejemplo se da a continuación
fig = plt.figure()
# Plot ROC curves
plotfigure(lambda: plt.plot(fpr1, tpr1, linestyle="--",color="orange", label="Logistic Regression"), fig)
plotfigure(lambda: plt.plot(fpr2, tpr2, linestyle="--",color="green", label="KNN"), fig)
plotfigure(lambda: plt.plot(p_fpr, p_tpr, linestyle="-", color="blue"), fig)
# Title
plt.title('ROC curve')
# X label
plt.xlabel('False Positive Rate')
# Y label
plt.ylabel('True Positive rate')
plt.legend(loc="best",labelcolor="white")
plt.savefig('ROC',dpi=300)
plt.show();
Aquí hay una función de utilidad que toma una función de trazado con los argumentos necesarios y traza la figura con los estilos de color de fondo requeridos. Puede agregar más argumentos según sea necesario.
def plotfigure(plot_fn, fig, background_col="xkcd:black", face_col = (0.06,0.06,0.06)):
"""
Plot Figure using plt plot functions.
Customize different background and face-colors of the plot.
Parameters:
plot_fn (func): The plot functions with necessary arguments as a lamdda function.
fig : The Figure object by plt.figure()
background_col: The background color of the plot. Supports matlplotlib colors
face_col: The face color of the plot. Supports matlplotlib colors
Returns:
void
"""
fig.patch.set_facecolor(background_col)
plot_fn()
ax = plt.gca()
ax.set_facecolor(face_col)
ax.spines['bottom'].set_color('white')
ax.spines['top'].set_color('white')
ax.spines['left'].set_color('white')
ax.spines['right'].set_color('white')
ax.xaxis.label.set_color('white')
ax.yaxis.label.set_color('white')
ax.grid(alpha=0.1)
ax.title.set_color('white')
ax.tick_params(axis="x", colors="white")
ax.tick_params(axis="y", colors="white")
Un caso de uso se define a continuación
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
X, y = make_classification(n_samples=50, n_classes=2, n_features=5, random_state=27)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=27)
fig=plt.figure()
plotfigure(lambda: plt.scatter(range(0,len(y)), y, marker=".",c="orange"), fig)
Duplicado para el eje: stackoverflow.com/questions/1982770/…
– Marca
21 de enero de 2011 a las 17:36