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):
Au secours!
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])
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]))
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:
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