在matplotlib箱线图中添加图例,其中多个图位于同一轴上

btxsgosb  于 2023-10-24  发布在  其他
关注(0)|答案(2)|浏览(109)

我有一个用matplotlib生成的箱线图:

然而,我不知道如何生成图例。每当我尝试下面的方法时,我都会得到一个错误,说Legend does not support {boxes: ...我已经做了相当多的搜索,似乎没有一个例子显示如何实现这一点。任何帮助都将不胜感激!

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')
x759pob2

x759pob21#

boxplot返回艺术家字典
结果:dict
将箱线图的每个组件Map到创建的matplotlib.lines.Line2D示例列表的字典。该字典具有以下键(假设垂直箱线图):

  • boxes:箱形图的主体,显示四分位数和中位数的置信区间(如果启用)。
  • [...]

使用boxes,您可以获取图例艺术家,

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

完整示例:

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()

ar5n3qh5

ar5n3qh52#

作为对@ImportanceOfBeingErnest的回应的补充,如果你在这样的for循环中绘图:

for data in datas:
    ax.boxplot(data, positions=[1,4], notch=True, widths=0.35, 
             patch_artist=True, boxprops=dict(facecolor="C0"))

你不能将图保存为变量。因此,在这种情况下,创建图例标签列表legends,将图附加到另一个列表elements中,并使用列表解析为每个图放置图例:

labels = ['A', 'B']
colors = ['blue', 'red']
elements = []

for data, color in zip(datas, colors):
    elements.append(ax.boxplot(data, positions=[1,4], notch=True,\
    widths=0.35, patch_artist=True, boxprops=dict(facecolor=color)))

ax.legend([element["boxes"][0] for element in elements], labels)

相关问题