web-dev-qa-db-fra.com

Ajout d'une légende à un boxplot matplotlib avec plusieurs tracés sur les mêmes axes

J'ai un boxplot généré avec matplotlib:

enter image description here

Cependant, je n'ai aucune idée de comment générer la légende. Chaque fois que j'essaye ce qui suit, j'obtiens une erreur disant Legend does not support {boxes: ... J'ai fait pas mal de recherches et il ne semble pas y avoir d'exemple montrant comment y parvenir. Toute aide serait appréciée!

bp1 = ax.boxplot(data1, positions=[1,4], notch=True, widths=0.35, patch_artist=True)
bp2 = ax.boxplot(data2, positions=[2,5], notch=True, widths=0.35, patch_artist=True)

ax.legend([bp1, bp2], ['A', 'B'], loc='upper right')
8
mbadd

boxplot renvoie un dictionnaire d'artistes

résultat: dict
Un dictionnaire mappant chaque composant du boxplot à une liste des instances matplotlib.lines.Line2D créées. Ce dictionnaire a les clés suivantes (en supposant des boîtes à moustaches verticales):

  • boxes: le corps principal du boxplot montrant les quartiles et les intervalles de confiance médians si activés.
  • [...]

En utilisant le boxes, vous pouvez obtenir les artistes de légende comme

ax.legend([bp1["boxes"][0], bp2["boxes"][0]], ['A', 'B'], loc='upper right')

Exemple complet:

import matplotlib.pyplot as plt
import numpy as np; np.random.seed(1)

data1=np.random.randn(40,2)
data2=np.random.randn(30,2)

fig, ax = plt.subplots()
bp1 = ax.boxplot(data1, positions=[1,4], notch=True, widths=0.35, 
                 patch_artist=True, boxprops=dict(facecolor="C0"))
bp2 = ax.boxplot(data2, positions=[2,5], notch=True, widths=0.35, 
                 patch_artist=True, boxprops=dict(facecolor="C2"))

ax.legend([bp1["boxes"][0], bp2["boxes"][0]], ['A', 'B'], loc='upper right')

ax.set_xlim(0,6)
plt.show()

enter image description here

18