Cómo cambiar el color del eje, las marcas y las etiquetas

7 minutos de lectura

Avatar de usuario de Richard Durr
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?

  • Duplicado para el eje: stackoverflow.com/questions/1982770/…

    – Marca

    21 de enero de 2011 a las 17:36

Avatar de usuario de Joe Kington
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()

texto alternativo

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))

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

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]

Avatar de usuario de Trenton McKinney
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, axque permite el uso de los métodos de formato asociados.
  • El backend de trazado predeterminado para pandases matplotlib.
  • 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

ingrese la descripción de la imagen aquí

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

ingrese la descripción de la imagen aquí

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

ingrese la descripción de la imagen aquí

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();

Producción:
Curva ROC

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)

La salida de la figura

¿Ha sido útil esta solución?