有没有办法在 matplotlib 箱线图图例中标记平均值和中位数?

Is there a way to label the mean and median in matplotlib boxplot legend?

提问人:skidjoe 提问时间:5/17/2020 更新时间:7/23/2020 访问量:5784

问:

我有以下箱形图,它绘制了一些值,每个箱体具有不同的平均值和中位数;我想知道是否有任何方法可以标记它们以使它们出现在图形图例中(因为当前的箱形图为中位数绘制了一条橙色线,为平均值绘制了一条蓝点,并且不清楚哪个是哪个)?还有没有办法为这些子图制作一个图例,而不是为每个子图图制作一个图例,因为它们本质上是相同的对象,只是不同的数据?

下面是其中一个子图的代码示例,其他子图相同,但数据不同:

fig = plt.figure()
xlim = (4, 24)
ylim = (0, 3700)

plt.subplot(1,5,5)
x_5_diff = {5: [200, 200, 291, 200, 291, 200, 291, 200, 291, 200, 291, 200, 291, 200, 291],
 7: [161, 161, 179, 161, 179, 161, 179, 161, 179, 161, 179, 161, 179, 161, 179],
 9: [205, 205, 109, 205, 109, 205, 109, 205, 109, 205, 109, 205, 109, 205, 109],
 11: [169, 169, 95, 169, 95, 169, 95, 169, 95, 169, 95, 169, 95, 169, 95],
 13: [43, 43, 70, 43, 70, 43, 70, 43, 70, 43, 70, 43, 70, 43, 70],
 15: [33, 33, 39, 33, 39, 33, 39, 33, 39, 33, 39, 33, 39, 33, 39],
 17: [23, 23, 126, 23, 126, 23, 126, 23, 126, 23, 126, 23, 126, 23, 126],
 19: [17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17],
 21: [15, 15, 120, 15, 120, 15, 120, 15, 120, 15, 120, 15, 120, 15, 120],
 23: [63, 63, 25, 63, 25, 63, 25, 63, 25, 63, 25, 63, 25, 63, 25]}

keys = sorted(x_5_diff)
plt.boxplot([x_5_diff[k] for k in keys], positions=keys)  # box-and-whisker plot
plt.hlines(y = 1600, colors= 'r', xmin = 5, xmax = 23, label = "Level 1 Completed")
plt.title("x = 5 enemies")
plt.ylim(0,3700)
plt.plot(keys, [sum(x_5_diff[k]) / len(x_5_diff[k]) for k in keys], '-o')


plt.legend()
plt.show()

任何帮助将不胜感激。

python matplotlib 箱线图

评论


答:

0赞 kapooraae489 5/17/2020 #1

将均值存储为单独的向量。在要绘制的向量上循环。 (一旦我有笔记本电脑,就会尝试实现)

评论

0赞 skidjoe 5/18/2020
那太好了,因为我不确定你到底想得到什么?因为我只是想让图例显示蓝点作为平均值,橙色线显示为中位数......
5赞 Nachtialler 7/23/2020 #2

有点晚了,但试试这个:

    bp = plt.boxplot([x_5_diff[k] for k in keys], positions=keys)

    # You can access boxplot items using ist dictionary
    plt.legend([bp['medians'][0], bp['means'][0]], ['median', 'mean'])

评论

1赞 Muhammad Yasirroni 9/10/2022
任何使用提示pandas.boxplot()?