861 votes

Comment changer la taille de la police sur un graphique matplotlib

Comment changer la taille de la police pour tous les éléments (ticks, étiquettes, titre) sur un graphique matplotlib?

Je sais comment changer la taille des étiquettes des ticks, cela se fait avec:

import matplotlib 
matplotlib.rc('xtick', labelsize=20) 
matplotlib.rc('ytick', labelsize=20) 

Mais comment changer le reste?

1063voto

Herman Schaaf Points 9938

De la documentation de matplotlib,

font = {'family' : 'normal',
        'weight' : 'bold',
        'size'   : 22}

matplotlib.rc('font', **font)

Ceci définit la police de tous les éléments sur la police spécifiée par l'objet kwargs, font.

Alternativement, vous pourriez également utiliser la méthode update de rcParams comme suggéré dans cette réponse:

matplotlib.rcParams.update({'font.size': 22})

ou

import matplotlib.pyplot as plt
plt.rcParams.update({'font.size': 22})

Vous pouvez trouver une liste complète des propriétés disponibles sur la page Customizing matplotlib.

11 votes

Agréable, sauf qu'il remplace toute propriété de taille de police trouvée sur son chemin è_é

4 votes

Où puis-je trouver plus d'options pour les éléments comme 'family', 'weight', etc.?

0 votes

@haccks j'ai ajouté un lien vers la page de personnalisation de matplotlib dans la réponse.

571voto

Pedro M Duarte Points 11762

Si vous êtes un maniaque du contrôle comme moi, vous voudrez probablement définir explicitement toutes vos tailles de police :

import matplotlib.pyplot as plt

SMALL_SIZE = 8
MEDIUM_SIZE = 10
BIGGER_SIZE = 12

plt.rc('font', size=SMALL_SIZE)          # contrôle des tailles de texte par défaut
plt.rc('axes', titlesize=SMALL_SIZE)     # taille de la police du titre des axes
plt.rc('axes', labelsize=MEDIUM_SIZE)    # taille de la police des étiquettes x et y
plt.rc('xtick', labelsize=SMALL_SIZE)    # taille de la police des étiquettes des graduations x
plt.rc('ytick', labelsize=SMALL_SIZE)    # taille de la police des étiquettes des graduations y
plt.rc('legend', fontsize=SMALL_SIZE)    # taille de la police de la légende
plt.rc('figure', titlesize=BIGGER_SIZE)  # taille de la police du titre de la figure

Notez que vous pouvez aussi définir les tailles en appelant la méthode rc sur matplotlib:

import matplotlib

SMALL_SIZE = 8
matplotlib.rc('font', size=SMALL_SIZE)
matplotlib.rc('axes', titlesize=SMALL_SIZE)

# et ainsi de suite ...

14 votes

J'ai essayé bon nombre des réponses. Celle-ci semble être la meilleure, du moins dans les cahiers Jupyter. Il vous suffit de copier le bloc ci-dessus en haut et de personnaliser les trois constantes de taille de police.

3 votes

D'accord avec fvitkor, c'est la meilleure réponse!

19 votes

Pour moi, la taille du titre n'a pas fonctionné. J'ai utilisé : plt.rc('axes', titlesize=BIGGER_SIZE)

256voto

ryggyr Points 676

Si vous souhaitez modifier la taille de la police pour un graphique spécifique qui a déjà été créé, essayez ceci :

import matplotlib.pyplot as plt

ax = plt.subplot(111, xlabel='x', ylabel='y', title='title')
for item in ([ax.title, ax.xaxis.label, ax.yaxis.label] +
             ax.get_xticklabels() + ax.get_yticklabels()):
    item.set_fontsize(20)

2 votes

Mon objectif était d'avoir la police des étiquettes x-y, des graduations et des titres de tailles différentes. Une version modifiée de cela a si bien fonctionné pour moi.

10 votes

Pour obtenir également les légendes, utilisez ax.legend().get_texts(). Testé sur Matplotlib 1.4.

0 votes

Cela répond le plus directement à la question. Merci.

225voto

Marius Retegan Points 818
matplotlib.rcParams.update({'font.size': 22})

2 votes

Dans mon cas, cette solution ne fonctionne que si je crée d'abord un graphique, puis que je le "mette à jour", comme suggéré, ce qui entraîne une mise à jour de la taille de police pour les nouvelles figures. Peut-être que le premier tracé est nécessaire pour initialiser les rcParams...

83voto

Brian Funt Points 99

Cette réponse s'adresse à toute personne essayant de changer toutes les polices, y compris pour la légende, et à toute personne essayant d'utiliser des polices et tailles différentes pour chaque élément. Il n'utilise pas rc (qui ne semble pas fonctionner pour moi). C'est peut-être un peu fastidieux mais je n'ai pas réussi à maîtriser une autre méthode, personnellement.

J'ai élaboré une approche légèrement différente et moins encombrée que ma réponse d'origine ci-dessous. Cela permet d'utiliser n'importe quelle police sur votre système, même les polices .otf. Pour avoir des polices distinctes pour chaque élément, il suffit d'écrire plus de variables font_path et font_prop.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager as font_manager
import matplotlib.ticker
# Solution de contournement pour le bogue des axes logarithmiques de Matplotlib 2.0.0 https://github.com/matplotlib/matplotlib/issues/8017 :
# matplotlib.ticker._mathdefault = lambda x: '\\mathdefault{%s}'%x 

# Définir les propriétés de la police (vous pouvez utiliser plus de variables pour plus de polices)
font_path = 'C:\Windows\Fonts\AGaramondPro-Regular.otf'
font_prop = font_manager.FontProperties(fname=font_path, size=14)

ax = plt.subplot() # Définit la variable ax en créant un tracé vide

# Définir les données à tracer
x = np.linspace(0, 10)
y = x + np.random.normal(x)
plt.plot(x, y, 'b+', label='Points de données')

for label in (ax.get_xticklabels() + ax.get_yticklabels()):
    label.set_fontproperties(font_prop)
    label.set_fontsize(13) # La taille ici remplace font_prop

plt.title("Oscillations décroissantes exponentiellement", fontproperties=font_prop,
          size=16, verticalalignment='bottom') # La taille ici remplace font_prop
plt.xlabel("Temps", fontproperties=font_prop)
plt.ylabel("Amplitude", fontproperties=font_prop)
plt.text(0, 0, "Texte divers", fontproperties=font_prop)

lgd = plt.legend(loc='lower right', prop=font_prop) # NB différent argument 'prop' pour la légende
lgd.set_title("Légende", prop=font_prop)

plt.show()

Réponse originale

Cela combine essentiellement la réponse de ryggyr ici avec d'autres réponses sur SO.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager as font_manager

# Définir les dictionnaires de police (pour le titre du graphique et les titres des axes)
title_font = {'fontname':'Arial', 'size':'16', 'color':'black', 'weight':'normal',
              'verticalalignment':'bottom'} # Alignement vertical en bas pour plus d'espace
axis_font = {'fontname':'Arial', 'size':'14'}

# Définir les propriétés de la police (pour une utilisation dans la légende)   
font_path = 'C:\Windows\Fonts\Arial.ttf'
font_prop = font_manager.FontProperties(fname=font_path, size=14)

ax = plt.subplot() # Définit la variable ax en créant un tracé vide

# Définir la police des étiquettes des ticks
for label in (ax.get_xticklabels() + ax.get_yticklabels()):
    label.set_fontname('Arial')
    label.set_fontsize(13)

x = np.linspace(0, 10)
y = x + np.random.normal(x) # Simule simplement des données

plt.plot(x, y, 'b+', label='Points de données')
plt.xlabel("Axe x", **axis_font)
plt.ylabel("Axe y", **axis_font)
plt.title("Graphique divers", **title_font)
plt.legend(loc='lower right', prop=font_prop, numpoints=1)
plt.text(0, 0, "Texte divers", **title_font)
plt.show()

En ayant plusieurs dictionnaires de polices, vous pouvez choisir différentes polices/tailles/pesanteurs/couleurs pour les divers titres, choisir la police pour les étiquettes des ticks, et choisir la police pour la légende, de manière indépendante.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X