Matplotlib riduce le dimensioni del carattere delle etichette tick


299

In una figura matplotlib, come posso ridurre la dimensione del carattere per le etichette di tick usando ax1.set_xticklabels()?

Inoltre, come è possibile ruotarlo da orizzontale a verticale?


Grazie per aver posto questa domanda, sto cercando di risolvere questo problema in questo momento. Non sono fortemente convinto qui, ma sembra che gli elettori pensino che la risposta migliore non sia quella accettata. Cosa ne pensi?
Aaron Hall

ho letto correttamente che ci sono almeno 5 modi diversi per cambiare la dimensione del carattere in matplotlib? : D
famargar,

Risposte:


127

Si noti che le versioni più recenti di MPL hanno un collegamento per questa attività. Un esempio è mostrato nell'altra risposta a questa domanda: https://stackoverflow.com/a/11386056/42346

Il codice seguente è a scopo illustrativo e potrebbe non essere necessariamente ottimizzato.

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

inserisci qui la descrizione dell'immagine


84
A parte questo: invece di scorrere tra gli oggetti delle etichette tick, puoi usare plt.setp. (Inoltre, dai un'occhiata ax.tick_params) Ad esempio, puoi semplicemente farlo plt.setp(ax.get_xticklabels(), rotation='vertical', fontsize=14). Inoltre, gli oggetti degli assi hanno un ax.is_last_row()metodo che può essere utile in casi come il tuo esempio. Invece di if i != len..., puoi farlo if not ax.is_last_row(). (Perché è un metodo, non ne ho idea ... Matplotlib odia le proprietà, a quanto pare!)
Joe Kington,

@Joe: questa è la prima volta che sento parlare is_last_row(), grazie! Ho usato plt.setpin passato e non ero necessariamente sicuro che rappresentasse un modo più canonico di personalizzare le etichette dei tick. Hai rimosso quel dubbio, grazie. Più in generale: le tue risposte, specialmente nel matplotlibtag, spesso mi lasciano a bocca aperta. Continuate così.
Mechanical_meat

1
Grazie!! Apprezzo le parole gentili, soprattutto da parte tua! Il canonico è molto relativo, in questo caso. plt.setpè un "matlab-ism" e un loop esplicito è probabilmente molto più pitonico. Essere un convertito matlab, io stesso, mi setpsento naturale, ma a ciascuno il suo. Entrambi sono abbastanza leggibili, imo
Joe Kington,

50
Nelle nuove versioni ho scoperto che dovevi usare il parametro labelsize : ad esax.tick_params(axis='x', labelsize=8)
Vladtn,

Dovrebbe essere get_ticklabelsnonget_major_ticks
Jez

506

In realtà c'è un modo più semplice. Ho appena trovato:

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)

Ciò risponde solo alle dimensioni di una labelparte della domanda.


2
Utilizzare axis = 'x'o axis = 'y'per modificare solo uno degli assi
loved.by.Jesus

221

Per specificare contemporaneamente la dimensione e la rotazione del carattere, prova questo:

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

4
Si noti che questo viene usato quando si lavora con un'interfaccia pyplot simile a MATLAB. In caso di interfaccia orientata agli oggetti, utilizzare il metodo tick_params () dell'oggetto axes o il metodo set_tick_params () dell'oggetto axis (vedere altre risposte).
Wombatonfire,

54

In alternativa, puoi semplicemente fare:

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

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

Questa è l'unica risposta che funziona se si desidera modificare la dimensione del carattere senza impostare nuove etichette.
David Stansby,

@DavidStansby Non credo sia vero. Ho avuto questo problema esatto (menzionato sopra) ed è stato in grado di utilizzare un metodo alternativo diverso da questa soluzione. usandoax.xaxis.set_tick_params(labelsize=20)
Kyle Swanson il

1
risposta più semplice, non richiede riferimento all'oggetto ax
jeremy_rutman,

26

Un'altra alternativa

Ho due grafici affiancati e vorrei regolare le etichette tick separatamente.

Le soluzioni di cui sopra erano vicine ma non funzionavano per me. Ho trovato la mia soluzione da questa pagina matplotlib .

ax.xaxis.set_tick_params(labelsize=20)

Questo ha fatto il trucco ed era dritto al punto. Nel mio caso d'uso, era la trama a destra che doveva essere modificata. Per la trama a sinistra da quando stavo creando nuove etichette tick sono stato in grado di regolare il carattere nello stesso processo di impostazione delle etichette.

vale a dire

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

quindi ho usato la trama giusta,

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

Una sottigliezza minore ... lo so ... ma spero che questo aiuti qualcuno :)

Punti bonus se qualcuno sa come regolare la dimensione del carattere dell'etichetta dell'ordine di grandezza.

inserisci qui la descrizione dell'immagine


22

Nelle versioni attuali di Matplotlib, puoi farlo axis.set_xticklabels(labels, fontsize='small').


1
Ciò ti costringe a specificare labelsanche questo. È meglio se possiamo cambiare solo la dimensione del carattere.
Guimoute,

16

Puoi anche modificare i parametri di visualizzazione delle etichette come fontsize con una linea come questa:

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

1
Penso che l'uso delle comprensioni di lista che abbiano effetti collaterali non sia la migliore pratica. Suggerirei invece di utilizzare uno standard per loop.
jjmontes,

14

Per caratteri più piccoli, io uso

ax1.set_xticklabels(xticklabels, fontsize=7)

e funziona!


come definisci xticklabels?
mLstudent33

10

Per me ha funzionato:

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

Il vantaggio di quanto sopra è che non c'è bisogno di fornire al arraydi labelse funziona con tutti i dati sul axes.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.