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?


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


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.


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)

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 

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

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


22

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


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

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!


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.