I have a boxplot generated with matplotlib:
However, I have no idea how to generate the legend. Whenever I try the following I get an error saying Legend does not support {boxes: ...
I've done a fair bit of searching and there doesn't seem to be an example showing how to achieve this. Any help would be appreciated!
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')
The boxplot
returns a dictionary of artists
result : dict
A dictionary mapping each component of the boxplot to a list of the matplotlib.lines.Line2D instances created. That dictionary has the following keys (assuming vertical boxplots):
boxes
: the main body of the boxplot showing the quartiles and the median's confidence intervals if enabled.- [...]
Using the boxes
, you can get the legend artists as
ax.legend([bp1["boxes"][0], bp2["boxes"][0]], ['A', 'B'], loc='upper right')
Complete example:
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()
Just as a complement to @ImportanceOfBeingErnest's response, if you are plotting in a for loop like this:
for data in datas:
ax.boxplot(data, positions=[1,4], notch=True, widths=0.35,
patch_artist=True, boxprops=dict(facecolor="C0"))
You cannot save the plots as variables. So in that case, create legend labels list legends
, append the plots into another list elements
and use list comprehension to put a legend for each of them:
labels = ['A', 'B']
colors = ['blue', 'red']
elements = []
for dIdx, data in enumerate(datas):
elements.append(ax.boxplot(data, positions=[1,4], notch=True,\
widths=0.35, patch_artist=True, boxprops=dict(facecolor=colors[dIdx])))
ax.legend([element["boxes"][0] for element in elements],
[labels[idx] for idx,_ in enumerate(datas)])
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.