web-dev-qa-db-fra.com

Changer l'épaisseur des lignes dans la légende matplotlib pyplot

J'aimerais modifier l'épaisseur/la largeur des échantillons de ligne figurant dans la légende Pyplot.

La largeur de ligne des exemples de ligne dans la légende est identique à celle représentée dans le graphique (ainsi, si la ligne y1 a linewidth=7.0, l'étiquette correspondante de la légende y1 aura également linewidth=7.0).

Je voudrais que les lignes de légende soient plus épaisses que les lignes figurant dans l'intrigue.

Par exemple, le code suivant génère l'image suivante:

import numpy as np
import matplotlib.pyplot as plt

# make some data
x = np.linspace(0, 2*np.pi)

y1 = np.sin(x)
y2 = np.cos(x)

# plot sin(x) and cos(x)
fig = plt.figure()
ax  = fig.add_subplot(111)
ax.plot(x, y1, c='b', label='y1',linewidth=7.0)
ax.plot(x, y2, c='r', label='y2')

leg = plt.legend()
plt.show()

example code plot

Je souhaite définir le libellé y1 dans la légende de manière à avoir linewidth=7.0, tandis que la ligne y1 figurant dans le tracé a une largeur différente (linewidth=1.0).

Je n'ai pas réussi à trouver une solution en ligne. Les seuls problèmes liés avaient des réponses pour changer la largeur de trait du cadre de sélection de légende via leg.get_frame().set_linewidth(7.0). Cela ne change pas la largeur de ligne des lignes dans la légende.

37
Alnitak

La réponse de @ImportanceOfBeingErnest est bonne si vous souhaitez uniquement modifier la largeur de trait dans la zone de légende. Mais je pense que c'est un peu plus complexe car il faut copier les poignées avant de changer la largeur de trait de la légende. En outre, il ne peut pas changer la taille de la police. Les deux méthodes suivantes peuvent non seulement modifier la largeur de trait, mais également la taille de la police du texte de l'étiquette de légende de manière plus concise.

Méthode 1

import numpy as np
import matplotlib.pyplot as plt

# make some data
x = np.linspace(0, 2*np.pi)

y1 = np.sin(x)
y2 = np.cos(x)

# plot sin(x) and cos(x)
fig = plt.figure()
ax  = fig.add_subplot(111)
ax.plot(x, y1, c='b', label='y1')
ax.plot(x, y2, c='r', label='y2')

leg = plt.legend()
# get the individual lines inside legend and set line width
for line in leg.get_lines():
    line.set_linewidth(4)
# get label texts inside legend and set font size
for text in leg.get_texts():
    text.set_fontsize('x-large')

plt.savefig('leg_example')
plt.show()

Méthode 2

import numpy as np
import matplotlib.pyplot as plt

# make some data
x = np.linspace(0, 2*np.pi)

y1 = np.sin(x)
y2 = np.cos(x)

# plot sin(x) and cos(x)
fig = plt.figure()
ax  = fig.add_subplot(111)
ax.plot(x, y1, c='b', label='y1')
ax.plot(x, y2, c='r', label='y2')

leg = plt.legend()
# get the lines and texts inside legend box
leg_lines = leg.get_lines()
leg_texts = leg.get_texts()
# bulk-set the properties of all lines and texts
plt.setp(leg_lines, linewidth=4)
plt.setp(leg_texts, fontsize='x-large')
plt.savefig('leg_example')
plt.show()

Les deux méthodes ci-dessus produisent la même image de sortie:

output image

18
jdhao