在同一轴上添加Matplotlib盒图的图例
在数据可视化中,盒图是一种常用的工具,能够更直观地展现数据的分布和离散程度。而在Matplotlib中,绘制盒图的函数是boxplot()
。然而,当我们需要在同一张图中展现多个盒图时,如何添加图例却成了一个问题。本文将介绍一种简单的方法,在同一轴上添加Matplotlib盒图的图例。
相关知识
在使用Matplotlib绘图时,我们需要引入Matplotlib库,一般使用以下代码:
import matplotlib.pyplot as plt
在绘制盒图时,我们需要使用boxplot()
函数。该函数接受一个或多个数组,每个数组代表一个数据集合。以下是一个简单的示例代码:
import numpy as np
import matplotlib.pyplot as plt
# 生成数据
data1 = np.random.normal(0, 1, 100)
data2 = np.random.normal(0, 2, 100)
data3 = np.random.normal(0, 3, 100)
# 绘制盒图
plt.boxplot([data1, data2, data3])
# 显示图形
plt.show()
上述代码中,我们生成了3个均值为0,标准差不同的正态分布数据集,然后使用boxplot()
函数绘制了这三个数据集的盒图。最后使用show()
函数显示了图形。我们可以看到,该代码绘制了三个盒图,但是却没有添加图例。我们需要解决这个问题。
解决方法
在Matplotlib中,添加图例一般使用legend()
函数实现。但是对于盒图来说,该函数并不能直接进行使用。在解决这个问题之前,我们需要先了解盒图的结构。
可以看到,盒图由五个元素组成:最大值、最小值、中位数、第一四分位数和第三四分位数。在Matplotlib中,boxplot()
函数返回一个字典对象,该对象包含了这些元素的值。我们可以在该字典对象中添加我们自己的元素,然后在图例中展示。
代码如下:
import numpy as np
import matplotlib.pyplot as plt
# 生成数据
data1 = np.random.normal(0, 1, 100)
data2 = np.random.normal(0, 2, 100)
data3 = np.random.normal(0, 3, 100)
# 计算中位数和四分位数
med1 = np.median(data1)
med2 = np.median(data2)
med3 = np.median(data3)
q1_1 = np.percentile(data1, 25)
q1_2 = np.percentile(data2, 25)
q1_3 = np.percentile(data3, 25)
q3_1 = np.percentile(data1, 75)
q3_2 = np.percentile(data2, 75)
q3_3 = np.percentile(data3, 75)
# 绘制盒图
box1 = plt.boxplot(data1, positions=[1], widths=0.5)
box2 = plt.boxplot(data2, positions=[2], widths=0.5)
box3 = plt.boxplot(data3, positions=[3], widths=0.5)
# 添加中位数和四分位数元素
plt.plot([1, 1], [q1_1, q3_1], 'k-', lw=1)
plt.plot([2, 2], [q1_2, q3_2], 'k-', lw=1)
plt.plot([3, 3], [q1_3, q3_3], 'k-', lw=1)
plt.scatter([1, 2, 3], [med1,med2, med3], marker='o', color='orange', s=50)
# 添加图例
legend_elements = [plt.Line2D([0], [0], marker='o', color='orange', label='Median'),
plt.Line2D([0], [0], color='black', lw=1, label='Quartiles')]
plt.legend(handles=legend_elements, loc='best')
# 显示图形
plt.show()
上述代码中,我们首先计算了中位数和四分位数的值,然后使用boxplot()
函数分别绘制了三个盒图,并将它们设置在了不同的位置(x轴坐标分别为1、2、3)。接着,我们手动添加了中位数和四分位数的元素,并使用scatter()
函数添加了图例。其中,legend_elements
列表包含了所有需要添加的元素。
结论
通过上面的例子,我们可以发现,使用Matplotlib绘制盒图时,可以通过手动添加元素的方式,在同一轴上添加图例。虽然需要进行一些额外的计算和操作,但这种方法可以实现很好的效果,不失为一种比较好的解决方案。