Recherche…


Légende Simple

Supposons que vous ayez plusieurs lignes dans un même tracé, chacune de couleur différente, et que vous souhaitiez créer une légende pour indiquer ce que chaque ligne représente. Vous pouvez le faire en passant une étiquette à chacune des lignes lorsque vous appelez plot() , par exemple, la ligne suivante sera intitulée "My Line 1" .

ax.plot(x, y1, color="red", label="My Line 1")

Ceci spécifie le texte qui apparaîtra dans la légende de cette ligne. Maintenant, pour rendre visible la légende, on peut appeler ax.legend()

Par défaut, il créera une légende dans une case située dans le coin supérieur droit du tracé. Vous pouvez transmettre des arguments à legend() pour le personnaliser. Par exemple, nous pouvons le positionner dans le coin inférieur droit, sans encadrer un cadre, et créer un titre pour la légende en appelant ce qui suit:

ax.legend(loc="lower right", title="Legend Title", frameon=False)

Voici un exemple:

Image de Simple Legend Example

import matplotlib.pyplot as plt

# The data
x =  [1, 2, 3]
y1 = [2,  15, 27]
y2 = [10, 40, 45]
y3 = [5,  25, 40]

# Initialize the figure and axes
fig, ax = plt.subplots(1, figsize=(8, 6))

# Set the title for the figure
fig.suptitle('Simple Legend Example ', fontsize=15)

# Draw all the lines in the same plot, assigning a label for each one to be
# shown in the legend
ax.plot(x, y1, color="red", label="My Line 1")
ax.plot(x, y2, color="green", label="My Line 2")
ax.plot(x, y3, color="blue", label="My Line 3")

# Add a legend with title, position it on the lower right (loc) with no box framing (frameon)
ax.legend(loc="lower right", title="Legend Title", frameon=False)

# Show the plot
plt.show()

Légende placée à l'extérieur de la parcelle

Parfois, il est nécessaire ou souhaitable de placer la légende en dehors de l’intrigue. Le code suivant montre comment le faire.

Image de la parcelle avec légende en dehors de la parcelle

import matplotlib.pylab as plt
fig, ax = plt.subplots(1, 1, figsize=(10,6)) # make the figure with the size 10 x 6 inches
fig.suptitle('Example of a Legend Being Placed Outside of Plot')

# The data
x =  [1, 2, 3]
y1 = [1, 2, 4]
y2 = [2, 4, 8]
y3 = [3, 5, 14]

# Labels to use for each line
line_labels = ["Item A", "Item B", "Item C"]

# Create the lines, assigning different colors for each one.
# Also store the created line objects
l1 = ax.plot(x, y1, color="red")[0]
l2 = ax.plot(x, y2, color="green")[0]
l3 = ax.plot(x, y3, color="blue")[0]

fig.legend([l1, l2, l3],              # List of the line objects
           labels= line_labels,       # The labels for each line
           loc="center right",        # Position of the legend
           borderaxespad=0.1,         # Add little spacing around the legend box
           title="Legend Title")      # Title for the legend

# Adjust the scaling factor to fit your legend text completely outside the plot
# (smaller value results in more space being made for the legend)
plt.subplots_adjust(right=0.85)

plt.show()

Une autre façon de placer la légende en dehors du tracé consiste à utiliser bbox_to_anchor + bbox_extra_artists + bbox_inches='tight' , comme illustré dans l'exemple ci-dessous:

entrer la description de l'image ici

import matplotlib.pyplot as plt

# Data 
all_x = [10,20,30]
all_y = [[1,3], [1.5,2.9],[3,2]]

# Plot
fig = plt.figure(1)
ax = fig.add_subplot(111)
ax.plot(all_x, all_y)

# Add legend, title and axis labels
lgd = ax.legend([ 'Lag ' + str(lag) for lag in all_x], loc='center right', bbox_to_anchor=(1.3, 0.5))
ax.set_title('Title')
ax.set_xlabel('x label')
ax.set_ylabel('y label')    

fig.savefig('image_output.png',
            dpi=300, 
            format='png', 
            bbox_extra_artists=(lgd,),
            bbox_inches='tight')

Légende unique partagée entre plusieurs sous-parcelles

Vous aurez parfois une grille de sous-parcelles et vous voulez avoir une seule légende décrivant toutes les lignes de chacune des sous-parcelles, comme dans l'image suivante.

Image de légende unique sur plusieurs sous-parcelles

Pour ce faire, vous devrez créer une légende globale pour la figure au lieu de créer une légende au niveau des axes (ce qui créera une légende distincte pour chaque sous-intrigue). Ceci est réalisé en appelant fig.legend() comme on peut le voir dans le code pour le code suivant.

fig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(10,4))
fig.suptitle('Example of a Single Legend Shared Across Multiple Subplots')

# The data
x =  [1, 2, 3]
y1 = [1, 2, 3]
y2 = [3, 1, 3]
y3 = [1, 3, 1]
y4 = [2, 2, 3]

# Labels to use in the legend for each line
line_labels = ["Line A", "Line B", "Line C", "Line D"]

# Create the sub-plots, assigning a different color for each line.
# Also store the line objects created
l1 = ax1.plot(x, y1, color="red")[0]
l2 = ax2.plot(x, y2, color="green")[0]
l3 = ax3.plot(x, y3, color="blue")[0]
l4 = ax3.plot(x, y4, color="orange")[0] # A second line in the third subplot

# Create the legend
fig.legend([l1, l2, l3, l4],     # The line objects
           labels=line_labels,   # The labels for each line
           loc="center right",   # Position of legend
           borderaxespad=0.1,    # Small spacing around legend box
           title="Legend Title"  # Title for the legend
           )

# Adjust the scaling factor to fit your legend text completely outside the plot
# (smaller value results in more space being made for the legend)
plt.subplots_adjust(right=0.85)

plt.show()

Quelque chose à noter à propos de l'exemple ci-dessus est le suivant:

l1 = ax1.plot(x, y1, color="red")[0]

Lorsque plot() est appelé, il renvoie une liste d'objets line2D . Dans ce cas, il retourne simplement une liste avec un seul objet line2D , extrait avec l'indexation [0] et stocké dans l1 .

Une liste de tous les objets line2D que nous souhaitons inclure dans la légende doit être transmise en premier argument à fig.legend() . Le deuxième argument de fig.legend() est également nécessaire. Il est supposé être une liste de chaînes à utiliser comme étiquettes pour chaque ligne de la légende.

Les autres arguments transmis à fig.legend() sont purement optionnels, et ne font que contribuer à affiner l'esthétique de la légende.

Plusieurs légendes sur les mêmes axes

Si vous appelez plt.legend() ou ax.legend() plus d'une fois, la première légende est supprimée et une nouvelle est dessinée. Selon la documentation officielle :

Cela a été fait de sorte qu'il est possible d'appeler la légende () à plusieurs reprises pour mettre à jour la légende aux dernières poignées sur les axes

N'ayez crainte, cependant: il est encore assez simple d'ajouter une seconde légende (ou troisième ou quatrième ...) à un axe. Dans l'exemple ici, nous traçons deux lignes, puis tracons les marqueurs sur leurs maxima et minima respectifs. Une légende concerne les lignes et l'autre les marqueurs.

import matplotlib.pyplot as plt
import numpy as np

# Generate data for plotting:  
x = np.linspace(0,2*np.pi,100)
y0 = np.sin(x)
y1 = .9*np.sin(.9*x)
# Find their maxima and minima and store
maxes = np.empty((2,2))
mins = np.empty((2,2))
for k,y in enumerate([y0,y1]):
    maxloc = y.argmax()
    maxes[k] = x[maxloc], y[maxloc]
    minloc = y.argmin()
    mins[k] = x[minloc], y[minloc]

# Instantiate figure and plot
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x,y0, label='y0')
ax.plot(x,y1, label='y1')
# Plot maxima and minima, and keep references to the lines
maxline, = ax.plot(maxes[:,0], maxes[:,1], 'r^')
minline, = ax.plot(mins[:,0], mins[:,1], 'ko')

# Add first legend:  only labeled data is included
leg1 = ax.legend(loc='lower left')
# Add second legend for the maxes and mins.
# leg1 will be removed from figure
leg2 = ax.legend([maxline,minline],['max','min'], loc='upper right')
# Manually add the first legend back
ax.add_artist(leg1)

entrer la description de l'image ici

La clé est de vous assurer que vous avez des références aux objets de légende. Le premier que vous instanciez ( leg1 ) est supprimé de la figure lorsque vous ajoutez le second, mais l'objet leg1 existe toujours et peut être rajouté avec ax.add_artist .

La grande chose est que vous pouvez toujours manipuler les deux légendes. Par exemple, ajoutez ce qui suit au bas du code ci-dessus:

leg1.get_lines()[0].set_lw(8)
leg2.get_texts()[1].set_color('b')

entrer la description de l'image ici

Enfin, il convient de mentionner que dans l'exemple, seules les lignes ont reçu des étiquettes lorsqu'elles ont été tracées, ce qui signifie que ax.legend() ajoute uniquement ces lignes à la leg1 . La légende des marqueurs ( leg2 ) nécessitait donc que les lignes et les étiquettes leg2 arguments lorsqu’elle était instanciée. Nous pourrions aussi avoir des étiquettes sur les marqueurs lorsqu'ils ont été tracés. Mais alors, les deux appels à ax.legend auraient nécessité des arguments supplémentaires pour que chaque légende ne contienne que les éléments souhaités.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow