Matplotlib reduce el tamaño de fuente de las etiquetas de marca


299

En una figura matplotlib, ¿cómo puedo hacer que el tamaño de fuente para las etiquetas de marca sea ax1.set_xticklabels()más pequeño?

Además, ¿cómo se puede rotar de horizontal a vertical?


Gracias por hacer esta pregunta, estoy tratando de resolver este problema ahora mismo. No soy muy obstinado aquí, pero parece que los votantes piensan que la mejor respuesta no es la aceptada. ¿Qué piensas?
Aaron Hall

¿Leí correctamente que hay al menos 5 formas diferentes de cambiar el tamaño de fuente en matplotlib? : D
famargar

Respuestas:


127

Tenga en cuenta que las versiones más nuevas de MPL tienen un acceso directo para esta tarea. Se muestra un ejemplo en la otra respuesta a esta pregunta: https://stackoverflow.com/a/11386056/42346

El siguiente código tiene fines ilustrativos y no necesariamente puede optimizarse.

import matplotlib.pyplot as plt
import numpy as np

def xticklabels_example():
    fig = plt.figure() 

    x = np.arange(20)
    y1 = np.cos(x)
    y2 = (x**2)
    y3 = (x**3)
    yn = (y1,y2,y3)
    COLORS = ('b','g','k')

    for i,y in enumerate(yn):
        ax = fig.add_subplot(len(yn),1,i+1)

        ax.plot(x, y, ls='solid', color=COLORS[i]) 

        if i != len(yn) - 1:
            # all but last 
            ax.set_xticklabels( () )
        else:
            for tick in ax.xaxis.get_major_ticks():
                tick.label.set_fontsize(14) 
                # specify integer or one of preset strings, e.g.
                #tick.label.set_fontsize('x-small') 
                tick.label.set_rotation('vertical')

    fig.suptitle('Matplotlib xticklabels Example')
    plt.show()

if __name__ == '__main__':
    xticklabels_example()

ingrese la descripción de la imagen aquí


84
Solo como un aparte: en lugar de recorrer los objetos de la etiqueta de marca, puede usar plt.setp. (Además, eche un vistazo a ax.tick_params) Por ejemplo, simplemente puede hacerlo plt.setp(ax.get_xticklabels(), rotation='vertical', fontsize=14). Además, los objetos axes tienen un ax.is_last_row()método que puede ser útil en casos como su ejemplo. En lugar de if i != len..., puedes hacerlo if not ax.is_last_row(). (¿Por qué es un método, no tengo idea ... Matplotlib odia las propiedades, aparentemente!)
Joe Kington

@ Joe: esta es la primera vez que oigo hablar is_last_row(), ¡gracias! Lo he usado plt.setpen el pasado, y no estaba necesariamente seguro de que representara una forma más canónica de personalizar las etiquetas de marca. Has eliminado esa duda, gracias. En términos más generales: sus respuestas, especialmente en la matplotlibetiqueta, con frecuencia me dejan asombrado. Mantener el buen trabajo.
mechanical_meat

1
¡¡Gracias!! Agradezco las amables palabras, especialmente de ti! Canonical es muy relativo, en este caso. plt.setpes un "matlab-ism", y un bucle explícito es probablemente mucho más pitónico. Ser un converso matlab, me setpsiento natural, pero para cada uno lo suyo. Cualquiera de los dos es bastante legible, IMO
Joe Kington

50
En las nuevas versiones, descubrí que tenía que usar el parámetro labelize : por ejemploax.tick_params(axis='x', labelsize=8)
Vladtn

En caso de ser get_ticklabelsnoget_major_ticks
Jez

506

Hay una manera más simple en realidad. Acabo de encontrar:

import matplotlib.pyplot as plt
# We prepare the plot  
fig, ax = plt.subplots()

# We change the fontsize of minor ticks label 
ax.tick_params(axis='both', which='major', labelsize=10)
ax.tick_params(axis='both', which='minor', labelsize=8)

Sin labelembargo, esto solo responde al tamaño de parte de su pregunta.


2
Utilizar axis = 'x' o axis = 'y'para modificar solo uno de los ejes
loved.by.Jesus

221

Para especificar el tamaño de fuente y la rotación al mismo tiempo, intente esto:

plt.xticks(fontsize=14, rotation=90)

44
Tenga en cuenta que esto se usa cuando se trabaja con la interfaz de pyplot tipo MATLAB. En el caso de la interfaz orientada a objetos, se debe utilizar el método tick_params () del objeto axes o el método set_tick_params () del objeto axis (ver otras respuestas).
wombatonfire

54

Alternativamente, solo puedes hacer:

import matplotlib as mpl
label_size = 8
mpl.rcParams['xtick.labelsize'] = label_size 

36
plt.tick_params(axis='both', which='minor', labelsize=12)

Esta es la única respuesta que funciona si desea cambiar el tamaño de fuente sin establecer nuevas etiquetas.
David Stansby

@DavidStansby No creo que esto sea cierto. Tuve este problema exacto (mencionado anteriormente) y pude usar un método alternativo diferente de esta solución. usandoax.xaxis.set_tick_params(labelsize=20)
Kyle Swanson el

1
respuesta más simple, no requiere referencia al objeto hacha
jeremy_rutman

26

Otra alternativa

Tengo dos parcelas una al lado de la otra y me gustaría ajustar las etiquetas de marca por separado.

Las soluciones anteriores estaban cerca, sin embargo, no me estaban funcionando. Encontré mi solución en esta página matplotlib .

ax.xaxis.set_tick_params(labelsize=20)

Esto hizo el truco y fue directo al grano. Para mi caso de uso, era la trama a la derecha la que necesitaba ser ajustada. Para el diagrama de la izquierda, ya que estaba creando nuevas etiquetas de marca, pude ajustar la fuente en el mismo proceso que al configurar las etiquetas.

es decir

ax1.set_xticklabels(ax1_x, fontsize=15)
ax1.set_yticklabels(ax1_y, fontsize=15)

así que usé para la trama correcta,

ax2.xaxis.set_tick_params(labelsize=24)
ax2.yaxis.set_tick_params(labelsize=24)

Una sutileza menor ... Lo sé ... pero espero que esto ayude a alguien :)

Puntos de bonificación si alguien sabe cómo ajustar el tamaño de fuente de la etiqueta de orden de magnitud.

ingrese la descripción de la imagen aquí


22

En las versiones actuales de Matplotlib, puedes hacerlo axis.set_xticklabels(labels, fontsize='small').


1
Eso te obliga a especificar labelstambién. Es mejor si podemos cambiar solo el tamaño de fuente.
Guimoute

16

También puede cambiar los parámetros de visualización de etiquetas como tamaño de fuente con una línea como esta:

zed = [tick.label.set_fontsize(14) for tick in ax.yaxis.get_major_ticks()]

1
Creo que usar las comprensiones de listas que tienen efectos secundarios no es la mejor práctica. Sugeriría usar un estándar para bucle en su lugar.
jjmontes

14

Para una fuente más pequeña, uso

ax1.set_xticklabels(xticklabels, fontsize=7)

¡y funciona!


¿Cómo define xticklabels?
mLstudent33

10

Lo siguiente funcionó para mí:

ax2.xaxis.set_tick_params(labelsize=7)
ax2.yaxis.set_tick_params(labelsize=7)

La ventaja de lo anterior es que no es necesario para proporcionar el arrayde labelsy funciona con cualquier dato en el axes.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.