web-dev-qa-db-fra.com

Comment ajuster la taille de la boîte de légende matplotlib?

J'ai un graphique dont le coin supérieur gauche est assez vide. J'ai donc décidé d'y mettre ma boîte de légende.

Cependant, je trouve que les éléments dans la légende sont très petits et que le légende elle-même est également assez petit.

Par "petit", je veux dire quelque chose comme ça

enter image description here

Comment puis-je agrandir les éléments ( et non les textes! ) dans la zone de légende?

Comment puis-je agrandir la boîte elle-même?

19
Sibbs Gambling

Pour contrôler le remplissage à l'intérieur de la légende (en augmentant efficacement la zone de légende), utilisez le borderpad kwarg.

Par exemple, voici la valeur par défaut:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 100)

fig, ax = plt.subplots()
for i in range(1, 6):
    ax.plot(x, i*x + x, label='$y={i}x + {i}$'.format(i=i))
ax.legend(loc='upper left')
plt.show()

enter image description here


Si nous changeons le rembourrage intérieur avec borderpad=2, nous allons agrandir la zone de légende globale (les unités sont des multiples de la taille de la police, similaires à em):

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 100)

fig, ax = plt.subplots()
for i in range(1, 6):
    ax.plot(x, i*x + x, label='$y={i}x + {i}$'.format(i=i))
ax.legend(loc='upper left', borderpad=2)
plt.show()

enter image description here


Alternativement, vous souhaiterez peut-être modifier l'espacement entre les éléments. Utilisez labelspacing pour contrôler cela:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 100)

fig, ax = plt.subplots()
for i in range(1, 6):
    ax.plot(x, i*x + x, label='$y={i}x + {i}$'.format(i=i))
ax.legend(loc='upper left', labelspacing=2)
plt.show()

enter image description here


Dans la plupart des cas, cependant, il est plus judicieux d'ajuster à la fois labelspacing et borderpad en même temps:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 100)

fig, ax = plt.subplots()
for i in range(1, 6):
    ax.plot(x, i*x + x, label='$y={i}x + {i}$'.format(i=i))
ax.legend(loc='upper left', borderpad=1.5, labelspacing=1.5)
plt.show()

enter image description here


D'un autre côté, si vous avez de très gros marqueurs, vous souhaiterez peut-être agrandir la longueur de la ligne indiquée dans la légende. Par exemple, la valeur par défaut pourrait ressembler à ceci:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 5)

fig, ax = plt.subplots()
for i in range(1, 6):
    ax.plot(x, i*x + x, marker='o', markersize=20,
            label='$y={i}x + {i}$'.format(i=i))
ax.legend(loc='upper left')
plt.show()

enter image description here

Si nous changeons handlelength, nous obtiendrons des lignes plus longues dans la légende, ce qui semble un peu plus réaliste. (Je modifie également borderpad et labelspacing ici pour donner plus de place.)

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 5)

fig, ax = plt.subplots()
for i in range(1, 6):
    ax.plot(x, i*x + x, marker='o', markersize=20,
            label='$y={i}x + {i}$'.format(i=i))
ax.legend(loc='upper left', handlelength=5, borderpad=1.2, labelspacing=1.2)
plt.show()

enter image description here


À partir des documents, voici quelques-unes des autres options que vous voudrez peut-être explorer:

Padding and spacing between various elements use following
keywords parameters. These values are measure in font-size
units. E.g., a fontsize of 10 points and a handlelength=5
implies a handlelength of 50 points.  Values from rcParams
will be used if None.

=====================================================================
Keyword       |    Description
=====================================================================
borderpad          the fractional whitespace inside the legend border
labelspacing       the vertical space between the legend entries
handlelength       the length of the legend handles
handletextpad      the pad between the legend handle and text
borderaxespad      the pad between the axes and legend border
columnspacing      the spacing between columns
68
Joe Kington

Lorsque vous appelez legend, vous pouvez utiliser l'argument prop avec un dict contenant size.

plt.errorbar(x, y, yerr=err, fmt='-o', color='k', label = 'DR errors')
plt.legend(prop={'size':50})

Par exemple. change legend size

Voir ici pour plus d'informations sur légende

11
dabillox