La légende n'apparaît pas dans le tracé de la zone empilée Matplotlib

Je crée un tracé de ligne/zone empilé en utilisant plt.fill_between () Méthode du pyplot, et après avoir essayé tant de choses, je ne suis toujours pas capable de comprendre pourquoi il n'affiche aucune légende ou étiquette (même quand je les fournis dans le code). Voici le code:

import matplotlib.pyplot as plt
import numpy

a1_label = 'record a1'
a2_label = 'record a2'

a1 = numpy.linspace(0,100,40)
a2 = numpy.linspace(30,100,40)

x = numpy.arange(0, len(a1), 1)

plt.fill_between(x, 0, a1, facecolor='green')
plt.fill_between(x, a1, a2, facecolor='red')
plt.title('some title')
plt.grid('on')
plt.legend([a1_label, a2_label])
plt.show()

Voici l'image générée (notez que la légende montre une boîte vide au lieu des étiquettes): boîte de légende vide en haut

Au secours!

22
demandé sur khan 2013-01-26 09:20:10

4 réponses

La commande fill_between() crée une PolyCollection qui n'est pas prise en charge par la commande legend().

Par conséquent, vous devrez utiliser un autre artiste matplotlib (compatible avec legend()) comme proxy, sans l'Ajouter aux axes (de sorte que l'artiste proxy ne sera pas dessiné dans les axes principaux) et le nourrir à la fonction de légende. (voir le guide de légende matplotlib pour plus de détails)

Dans votre cas, le code ci-dessous devrait résoudre votre problème:

from matplotlib.patches import Rectangle

p1 = Rectangle((0, 0), 1, 1, fc="green")
p2 = Rectangle((0, 0), 1, 1, fc="red")
legend([p1, p2], [a1_label, a2_label])

image

37
répondu gcalmettes 2016-08-09 08:51:49

La réponse de Gcalmettes était un début utile, mais je voulais que ma légende reprenne les couleurs que le stackplot avait automatiquement attribuées. Voici comment je l'ai fait:

polys = pyplot.stackplot(x, y)
legendProxies = []
for poly in polys:
    legendProxies.append(pyplot.Rectangle((0, 0), 1, 1, fc=poly.get_facecolor()[0]))
19
répondu Andrew M. Greene 2013-08-26 17:33:38

Une autre technique, sans doute plus facile, consiste à tracer un ensemble de données vide, et à utiliser son entrée de Légende:

plt.plot([], [], color='green', linewidth=10)
plt.plot([], [], color='red', linewidth=10)

Cela fonctionne bien si vous avez d'autres étiquettes de données pour la Légende:

entrez la description de l'image ici

17
répondu kwarrick 2014-06-13 02:26:57

Seulement pour donner une mise à jour à ce sujet comme je le cherche. À 2016, PolyCollection fournit déjà un support pour l'attribut label comme vous pouvez le voir:

Https://github.com/matplotlib/matplotlib/pull/3303#event-182205203

4
répondu Fernando Ferreira 2016-02-03 13:42:43