698 votes

Comment changer la taille de la police sur un graphique de Matplotlib ?

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

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

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

Mais comment changer le reste ?

839voto

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 avec la police spécifiée par l'objet kwargs, font .

5 votes

sympa, sauf qu'il remplace toutes les propriétés fontsize trouvées sur son chemin è_é

3 votes

Où puis-je trouver plus d'options pour des é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.

449voto

Pedro M Duarte Points 11762

Si vous êtes un maniaque du contrôle comme moi, vous voudrez peut-être 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)          # controls default text sizes
plt.rc('axes', titlesize=SMALL_SIZE)     # fontsize of the axes title
plt.rc('axes', labelsize=MEDIUM_SIZE)    # fontsize of the x and y labels
plt.rc('xtick', labelsize=SMALL_SIZE)    # fontsize of the tick labels
plt.rc('ytick', labelsize=SMALL_SIZE)    # fontsize of the tick labels
plt.rc('legend', fontsize=SMALL_SIZE)    # legend fontsize
plt.rc('figure', titlesize=BIGGER_SIZE)  # fontsize of the figure title

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

import matplotlib

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

# and so on ...

11 votes

J'ai essayé plusieurs des réponses. Celle-ci semble la meilleure, du moins dans les carnets Jupyter. Il 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 !

13 votes

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

224voto

ryggyr Points 676

Si vous souhaitez modifier la taille de la police pour un tracé 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)

1 votes

Mon objectif était de faire en sorte que les polices des étiquettes x-y, des ticks et des titres soient de tailles différentes. Une version modifiée de ceci a très bien fonctionné pour moi.

9 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.

214voto

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

2 votes

Dans certains cas, cette solution ne fonctionne que si je crée un premier tracé, puis que je le "mets à jour" comme suggéré, ce qui entraîne une mise à jour de la taille de la police pour les nouveaux chiffres. Peut-être que le premier tracé est nécessaire pour initialiser rcParams...

79voto

Brian Funt Points 99

Cette réponse s'adresse à tous ceux qui essaient de changer toutes les polices, y compris pour la légende, et à tous ceux qui essaient d'utiliser des polices et des tailles différentes pour chaque élément. Elle n'utilise pas rc (qui ne semble pas fonctionner pour moi). Elle est assez lourde, mais je n'ai pas pu me débrouiller avec une autre méthode personnellement. Elle combine essentiellement la réponse de ryggyr ici et d'autres réponses sur SO.

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

# Set the font dictionaries (for plot title and axis titles)
title_font = {'fontname':'Arial', 'size':'16', 'color':'black', 'weight':'normal',
              'verticalalignment':'bottom'} # Bottom vertical alignment for more space
axis_font = {'fontname':'Arial', 'size':'14'}

# Set the font properties (for use in legend)   
font_path = 'C:\Windows\Fonts\Arial.ttf'
font_prop = font_manager.FontProperties(fname=font_path, size=14)

ax = plt.subplot() # Jjust creates a plot

# Set the tick labels font
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) # Just simulates some data

plt.plot(x, y, 'b+', label='Data points')
plt.xlabel("x axis", **axis_font)
plt.ylabel("y axis", **axis_font)
plt.title("Misc graph", **title_font)
plt.legend(loc='lower right', prop=font_prop, numpoints=1)
plt.text(0, 0, "Misc text", **title_font)
plt.show()

L'avantage de cette méthode est que, en disposant de plusieurs dictionnaires de polices, vous pouvez choisir différentes polices/tailles/poids/couleurs pour les divers titres, choisir la police des étiquettes de coche et choisir la police de la légende, le tout indépendamment.

UPDATE :

J'ai mis au point une approche légèrement différente, moins encombrée, qui supprime les dictionnaires de polices et autorise toutes les polices présentes sur votre système, même les polices .otf. Pour avoir des polices séparées pour chaque chose, il suffit d'écrire plus de font_path et font_prop comme des variables. (Commence après l'importation des modules)

# Set the font properties (can use more variable for more fonts)
font_path = 'C:\Windows\Fonts\AGaramondPro-Regular.otf'
font_prop = font_manager.FontProperties(fname=font_path, size=14)

ax = plt.subplot() # Just creates an empty plot

x = np.linspace(0, 10)
y = x + np.random.normal(x)
plt.plot(x, y, 'b+', label='Data points')

for label in (ax.get_xticklabels() + ax.get_yticklabels()):
    label.set_fontproperties(font_prop)
    label.set_fontsize(13) # Size here overrides font_prop

plt.title("Exponentially decaying oscillations", fontproperties=font_prop,
          size=16, verticalalignment='bottom') # Size here overrides font_prop
plt.xlabel("Time", fontproperties=font_prop)
plt.ylabel("Amplitude", fontproperties=font_prop)
plt.legend(loc='lower right', prop=font_prop)
plt.text(0, 0, "Misc text", fontproperties=font_prop)
plt.show()

J'espère que cette réponse est complète :) Si vous avez un titre de légende, Dieu m'en préserve, je ne peux pas vous aider.

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