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

374

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

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

2
  • Gracias por hacer esta pregunta, estoy tratando de resolver este problema en este momento. No tengo muchas opiniones aquí, pero parece que los votantes piensan que la mejor respuesta no es la aceptada. ¿Qué piensas? 18/06/2017 a las 19:25
  • ¿Leí correctamente que hay al menos 5 formas diferentes de cambiar el tamaño de fuente en matplotlib? :D 26 feb 2018 a las 13:06
156

Tenga en cuenta que las versiones más recientes de MPL tienen un atajo 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 se puede optimizar.

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í

5
  • 92
    Solo como un aparte: en lugar de recorrer los objetos de la etiqueta de marca, puede usar plt.setp. (También, 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 de ejes tienen un ax.is_last_row()método que puede ser útil en casos como su ejemplo. En lugar de if i != len...hacerlo, puede hacerlo if not ax.is_last_row(). (Por qué es un método, no tengo ni idea ... ¡Matplotlib odia las propiedades, aparentemente!) 18/06/11 a las 2:11
  • @Joe: esta es la primera vez que escucho sobre ello 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. 18/06/11 a las 2:51
  • 1
    ¡¡Gracias!! ¡Aprecio las amables palabras, especialmente de usted! Canonical es muy relativo, en este caso. plt.setpes un "matlab-ismo", y un bucle explícito es probablemente mucho más pitónico. Ser un converso de matlab, yo mismo, se setpsiente natural, pero para cada uno lo suyo. Cualquiera de los dos es bastante legible, en mi opinión 18/06/11 a las 3:36
  • sesenta y cinco
    En las nuevas versiones, descubrí que tenía que usar el parámetro de tamaño de etiqueta : p. Ej.ax.tick_params(axis='x', labelsize=8)
    Vladtn
    16/02/12 a las 20:49
  • En caso de ser get_ticklabelsnoget_major_ticks
    jez
    15 de junio de 2015 a las 10:25
638

En realidad, existe una forma más sencilla. 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.

1
  • 13
    Utilice axis = 'x'o axis = 'y'para modificar solo uno de los ejes 28 abr.20 a las 15:08
282

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

plt.xticks(fontsize=14, rotation=90)
1
  • 8
    Tenga en cuenta que esto se usa cuando se trabaja con una interfaz pyplot similar a MATLAB. En el caso de la interfaz orientada a objetos, se debe usar el método tick_params () del objeto de ejes o el método set_tick_params () del objeto de eje (ver otras respuestas). 20/07/2018 a las 17:45
61

Alternativamente, puede simplemente hacer:

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

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 de matplotlib .

ax.xaxis.set_tick_params(labelsize=20)

Esto funcionó y fue directo al grano. Para mi caso de uso, era la gráfica de la derecha la que necesitaba ser ajustada. Para el gráfico de la izquierda, ya que estaba creando nuevas etiquetas de marca, pude ajustar la fuente en el mismo proceso que establecí las etiquetas.

es decir

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

así usé para la trama correcta,

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

Una pequeña sutileza ... 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í

48
plt.tick_params(axis='both', which='minor', labelsize=12)
4
  • Esta es la única respuesta que funciona si desea cambiar el tamaño de fuente sin establecer nuevas etiquetas. 20 sep 2017 a las 9:20
  • @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. utilizandoax.xaxis.set_tick_params(labelsize=20) 15 oct 2018 a las 22:47
  • 1
    respuesta más simple, no requiere referencia al objeto ax 6 de julio de 2019 a las 8:54
  • Yo diría que querrías un objeto de hacha ... pero para cada uno lo suyo 19 de febrero a las 1:46
23

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

1
  • 4
    Eso te obliga a especificar el labelstambién. Es mejor si podemos cambiar solo el tamaño de la fuente. 20/11/19 a las 13:47
15

También puede cambiar los parámetros de visualización de etiquetas como el 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
  • 2
    Creo que usar listas comprensivas que tienen efectos secundarios no es la mejor práctica. Sugeriría usar un bucle for estándar en su lugar. 31/07/19 a las 17:59
14

Para fuentes más pequeñas, utilizo

ax1.set_xticklabels(xticklabels, fontsize=7)

¡y funciona!

2
  • 1
    ¿cómo se define xticklabels? 20 feb.20 a las 19:21
  • @ mLstudent33 es solo una lista de etiquetas ... podría ser cualquier cosa en realidad 19 de febrero a las 1:46
13

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.