Comment changer la taille de la légende avec matplotlib.pyplot

324

Question simple ici: j'essaie de réduire la taille de ma légende matplotlib.pyplot(c'est-à-dire que le texte soit plus petit). Le code que j'utilise ressemble à ceci:

plot.figure()
plot.scatter(k, sum_cf, color='black', label='Sum of Cause Fractions')
plot.scatter(k, data[:, 0],  color='b', label='Dis 1: cf = .6, var = .2')
plot.scatter(k, data[:, 1],  color='r',  label='Dis 2: cf = .2, var = .1')
plot.scatter(k, data[:, 2],  color='g', label='Dis 3: cf = .1, var = .01')
plot.legend(loc=2)
Mike
la source

Réponses:

543

Vous pouvez définir une taille de police individuelle pour la légende en ajustant le propmot - clé.

plot.legend(loc=2, prop={'size': 6})

Cela prend un dictionnaire de mots-clés correspondant aux matplotlib.font_manager.FontPropertiespropriétés. Voir la documentation pour la légende :

Arguments des mots clés:

prop: [ None | FontProperties | dict ]
    A matplotlib.font_manager.FontProperties instance. If prop is a 
    dictionary, a new instance will be created with prop. If None, use
    rc settings.

Il est également possible, à partir de la version 1.2.1 , d'utiliser le mot-clé fontsize.

Yann
la source
1
Pourriez-vous me dire où puis-je trouver des détails plot.rcParams.update?
haccks
64

Cela devrait faire

import pylab as plot
params = {'legend.fontsize': 20,
          'legend.handlelength': 2}
plot.rcParams.update(params)

Faites ensuite l'intrigue.

Il existe une tonne d'autres rcParams, ils peuvent également être définis dans le fichier matplotlibrc.

On peut aussi supposer que vous pouvez le changer en passant une matplotlib.font_manager.FontPropertiesinstance mais cela, je ne sais pas comment faire. -> voir la réponse de Yann.

Mauro
la source
2
Oumatplotlib.rc('legend', fontsize=0.5, linewidth=2)
Eric
2
cela devrait être legend.handlelengthau lieu delegend.linewidth
Emmet B
Le membre get_default_size () de FontManager renvoie la taille par défaut. Pour moi, c'est 12
guhur
1
L'utilisation de "PyLab" n'est plus encouragée: matplotlib.org/faq/…
Hagbard
51

en utilisant import matplotlib.pyplot as plt

Méthode 1: spécifiez la taille de la police lors de l'appel de la légende (répétitif)

plt.legend(fontsize=20) # using a size in points
plt.legend(fontsize="x-large") # using a named size

Avec cette méthode, vous pouvez définir la taille de police pour chaque légende à la création (vous permettant d'avoir plusieurs légendes avec différentes tailles de police). Cependant, vous devrez tout taper manuellement chaque fois que vous créez une légende.

(Remarque: @ Mathias711 a répertorié les tailles de police nommées disponibles dans sa réponse)

Méthode 2: spécifiez la taille de police dans rcParams (pratique)

plt.rc('legend',fontsize=20) # using a size in points
plt.rc('legend',fontsize='medium') # using a named size

Avec cette méthode, vous définissez la taille de police par défaut de la légende, et toutes les légendes l'utiliseront automatiquement, sauf indication contraire à l'aide de la méthode 1. Cela signifie que vous pouvez définir la taille de police de votre légende au début de votre code, et ne vous inquiétez pas de la définir pour chaque légende individuelle .

Si vous utilisez une taille nommée, par exemple 'medium', le texte de la légende sera mis à l'échelle avec le global font.sizein rcParams. Pour changer d' font.sizeutilisationplt.rc(font.size='medium')

binnev
la source
1
Juste pour informer les débutants de Python (comme moi): la méthode 1 ne fonctionne qu'après avoir créé un tracé (après une ligne plot ()) et la méthode 2 ne fonctionne que avant de créer un tracé. Je vous remercie. Je suis d'accord avec @Scott Gigante, cela devrait être la réponse!
Mateus da Silva Teixeira
42

Il existe également quelques tailles de police nommées , en dehors de la taille en points:

xx-small
x-small
small
medium
large
x-large
xx-large

Usage:

pyplot.legend(loc=2, fontsize = 'x-small')
Mathias711
la source
19

Il existe plusieurs paramètres pour ajuster la taille de la légende. Les deux que je trouve les plus utiles sont:

  • labelspacing: qui définit l'espacement entre les entrées d'étiquette en multiples de la taille de la police. Par exemple avec une police de 10 points, legend(..., labelspacing=0.2)réduira l'espacement entre les entrées à 2 points. La valeur par défaut sur mon installation est d'environ 0,5.
  • prop: qui permet un contrôle total de la taille de la police, etc. Vous pouvez définir une police à 8 points à l'aide de legend(..., prop={'size':8}). La valeur par défaut sur mon installation est d'environ 14 points.

De plus, la documentation légende énumère un certain nombre d'autres paramètres de remplissage et d' espacement , y compris: borderpad, handlelength, handletextpad, borderaxespadet columnspacing. Celles-ci suivent toutes la même forme que l'espacement des étiquettes et la zone également en multiples de taille de police.

Ces valeurs peuvent également être définies comme valeurs par défaut pour toutes les figures à l'aide du fichier matplotlibrc .

Bryan P
la source
5

Sur mon installation, FontProperties ne change que la taille du texte, mais il est toujours trop grand et espacé. J'ai trouvé un paramètre pyplot.rcParams: legend.labelspacingque je devine est fixé à une fraction de la taille de la police. Je l'ai changé avec

pyplot.rcParams.update({'legend.labelspacing':0.25})

Je ne sais pas comment le spécifier à la fonction pyplot.legend - en passant

prop={'labelspacing':0.25}

ou

prop={'legend.labelspacing':0.25}

revient avec une erreur.

swint144
la source
0

plot.legend (loc = 'en bas à droite', decimal_places = 2, fontsize = '11', title = 'Hey there', title_fontsize = '20')

Adarsha Neupane
la source