Matplotlib réduit la taille de la police des étiquettes à cocher

299

Dans une figure matplotlib, comment puis-je réduire la taille de la police des étiquettes de graduation ax1.set_xticklabels()?

De plus, comment peut-on le faire pivoter de l'horizontale à la verticale?

Ouvrez la voie
la source
Merci d'avoir posé cette question, j'essaie de résoudre ce problème en ce moment. Je ne suis pas fortement opinionné ici, mais il semble que les électeurs pensent que la meilleure réponse n'est pas celle qui est acceptée. Qu'est-ce que tu penses?
Aaron Hall
ai-je bien lu qu'il y a au moins 5 façons différentes de changer la taille de la police dans matplotlib? : D
famargar

Réponses:

127

Veuillez noter que les nouvelles versions de MPL ont un raccourci pour cette tâche. Un exemple est montré dans l'autre réponse à cette question: https://stackoverflow.com/a/11386056/42346

Le code ci-dessous est à titre indicatif et peut ne pas être nécessairement optimisé.

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

entrez la description de l'image ici

viande_mecanique
la source
84
Juste à part: Au lieu de parcourir les objets d'étiquette, vous pouvez utiliser plt.setp. (Aussi, jetez un œil à ax.tick_params) Par exemple, vous pouvez simplement le faire plt.setp(ax.get_xticklabels(), rotation='vertical', fontsize=14). De plus, les objets axes ont une ax.is_last_row()méthode qui peut être pratique dans des cas comme votre exemple. Au lieu de cela if i != len..., vous pouvez le faire if not ax.is_last_row(). (Pourquoi c'est une méthode, je n'en ai aucune idée ... Matplotlib déteste les propriétés, apparemment!)
Joe Kington
@Joe: c'est la première fois que j'entends parler is_last_row(), merci! J'ai utilisé plt.setpdans le passé, et je n'étais pas nécessairement sûr que cela représentait une manière plus canonique de personnaliser les étiquettes de tick. Vous avez levé ce doute, merci. Plus largement: vos réponses, notamment dans le matplotlibtag, me laissent souvent en admiration. Continuez ce bon travail.
mechanical_meat
1
Merci!! J'apprécie les aimables paroles, surtout de votre part! Canonical est très relatif, dans ce cas. plt.setpest un "matlab-ism", et une boucle explicite est probablement beaucoup plus pythonique. Être un matlab converti, moi-même, me setpsemble naturel, mais pour chacun d'eux. L'un ou l'autre est tout à fait lisible, imo
Joe Kington
50
Dans les nouvelles versions, j'ai constaté que vous deviez utiliser le paramètre labelsize : par exempleax.tick_params(axis='x', labelsize=8)
Vladtn
Ne devrait get_ticklabelspas êtreget_major_ticks
jez
506

Il existe en fait un moyen plus simple. Je viens de trouver:

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)

Cela ne répond cependant qu'à la taille d'une labelpartie de votre question.

Autiwa
la source
2
Utilisez axis = 'x'ou axis = 'y'pour modifier un seul des axes
loves.by.Jesus
221

Pour spécifier à la fois la taille de la police et la rotation en même temps, essayez ceci:

plt.xticks(fontsize=14, rotation=90)
scottlittle
la source
4
Notez que ceci est utilisé lorsque vous travaillez avec une interface pyplot de type MATLAB. Dans le cas d'une interface orientée objet, la méthode tick_params () de l'objet axes ou la méthode set_tick_params () de l'objet axe doivent être utilisées (voir les autres réponses).
wombatonfire
54

Alternativement, vous pouvez simplement faire:

import matplotlib as mpl
label_size = 8
mpl.rcParams['xtick.labelsize'] = label_size 
user2468932
la source
36
plt.tick_params(axis='both', which='minor', labelsize=12)
jingweimo
la source
C'est la seule réponse qui fonctionne si vous souhaitez modifier la taille de la police sans définir de nouvelles étiquettes.
David Stansby
@DavidStansby Je ne crois pas que ce soit vrai. J'ai eu ce problème exact (mentionné ci-dessus) et j'ai pu utiliser une autre méthode différente de cette solution. en utilisantax.xaxis.set_tick_params(labelsize=20)
Kyle Swanson
1
réponse la plus simple, ne nécessite pas de référence à l'objet hache
jeremy_rutman
26

Une autre alternative

J'ai deux tracés côte à côte et j'aimerais ajuster les étiquettes des graduations séparément.

Les solutions ci-dessus étaient proches mais elles ne fonctionnaient pas pour moi. J'ai trouvé ma solution sur cette page matplotlib .

ax.xaxis.set_tick_params(labelsize=20)

Cela a fait l'affaire et était direct. Pour mon cas d'utilisation, c'était l'intrigue à droite qui devait être ajustée. Pour l'intrigue de gauche depuis que je créais de nouvelles étiquettes de graduation, j'ai pu ajuster la police en suivant le même processus que la définition des étiquettes.

c'est à dire

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

j'ai donc utilisé pour la bonne intrigue,

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

Une subtilité mineure ... Je sais ... mais j'espère que cela aide quelqu'un :)

Points bonus si quelqu'un sait comment ajuster la taille de police de l'étiquette d'ordre de grandeur.

entrez la description de l'image ici

Kyle Swanson
la source
22

Dans les versions actuelles de Matplotlib, vous pouvez le faire axis.set_xticklabels(labels, fontsize='small').

Christoph
la source
1
Cela vous oblige à spécifier le labelstrop. Il est préférable de modifier uniquement la taille de la police.
Guimoute
16

Vous pouvez également modifier les paramètres d'affichage des étiquettes comme la taille de la police avec une ligne comme celle-ci:

zed = [tick.label.set_fontsize(14) for tick in ax.yaxis.get_major_ticks()]
ATX_Bigfoot
la source
1
Je pense que l'utilisation de listes de compréhension qui ont des effets secondaires n'est pas la meilleure pratique. Je suggère d'utiliser à la place une boucle standard.
jjmontes
14

Pour les polices plus petites, j'utilise

ax1.set_xticklabels(xticklabels, fontsize=7)

et il fonctionne!

Pengyao
la source
comment définissez-vous les xticklabels?
mLstudent33
10

Ce qui suit a fonctionné pour moi:

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

L'avantage de ce qui précède est que vous n'avez pas besoin de fournir arrayde données labelset de travailler avec axes.

Cryptoman
la source