web-dev-qa-db-fra.com

Est-il possible d'ajouter une chaîne comme élément de légende dans matplotlib

Je produis quelques parcelles dans matplotlib et je voudrais ajouter un texte explicatif pour certaines des données. Je veux avoir une chaîne dans ma légende en tant qu'élément de légende distinct au-dessus de l'élément "0-10". Est-ce que quelqu'un sait s'il existe un moyen possible de le faire?

enter image description here

Voici le code de ma légende:
ax.legend(['0-10','10-100','100-500','500+'],loc='best')

27
Osmond Bishop

Sûr. ax.legend() a une forme à deux arguments qui accepte une liste d'objets (poignées) et une liste de chaînes (étiquettes). Utilisez un objet factice (aka a "proxy artist" ) pour votre chaîne supplémentaire. J'ai choisi un matplotlib.patches.Rectangle sans remplissage et 0 ligne avec ci-dessous, mais vous pouvez utiliser n'importe quel artiste pris en charge.

Par exemple, supposons que vous ayez 4 objets barres (puisque vous n'avez pas posté le code utilisé pour générer le graphique, je ne peux pas le reproduire exactement).

import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
fig = plt.figure()
ax = fig.add_subplot(111)
bar_0_10 = ax.bar(np.arange(0,10), np.arange(1,11), color="k")
bar_10_100 = ax.bar(np.arange(0,10), np.arange(30,40), bottom=np.arange(1,11), color="g")
# create blank rectangle
extra = Rectangle((0, 0), 1, 1, fc="w", fill=False, edgecolor='none', linewidth=0)
ax.legend([extra, bar_0_10, bar_10_100], ("My explanatory text", "0-10", "10-100"))
plt.show()

example output

37
Jeff Tratner

Solution alternative, un peu sale mais assez rapide.

import pylab as plt

X = range(50)
Y = range(50)

plt.plot(X, Y, label="Very straight line")
# Create empty plot with blank marker containing the extra label
plt.plot([], [], ' ', label="Extra label on the legend")


plt.legend()

plt.show()

enter image description here

36
Clement H.