如何在Python Matploblib的箱线图中显示平均值?
箱线图是一种常用的可视化工具,可以用于表示数据的多个统计信息,如最小值、第一四分位数、中位数、第三四分位数、最大值等,以便于比较不同数据之间的差异。然而,在某些情况下,我们可能需要在箱线图中同时显示平均值。那么,如何在Python Matplotlib的箱线图中显示平均值呢?本文将为大家详细介绍。
我们先来看一个基本的箱线图:
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(1)
data = np.random.normal(size=(100, 4))
labels = ['A', 'B', 'C', 'D']
plt.boxplot(data, labels=labels)
plt.show()
该代码生成了一个包含4组数据的箱线图,其中每组数据包含了100个具有正态分布的随机数。
从图中可以看出,每组数据都被表示为一个方框(也称为箱子或盒子),箱子的上边和下边分别代表了第三四分位数(Q3)和第一四分位数(Q1),中间的线代表了中位数(中值),箱子的长度代表了数据的分布范围。此外,还可以看到每组数据的最小值和最大值所代表的点。可以发现,在这个箱线图中并没有显示平均值,接下来我们将会介绍几种方法来实现该功能。
阅读更多:Python 教程
方法一:添加均值线
一种直观、简单的方式就是在每个箱子上添加一条均值线。均值可以通过numpy中的mean函数计算得到,以更改样式为例:
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(1)
data = np.random.normal(size=(100, 4))
labels = ['A', 'B', 'C', 'D']
fig, ax = plt.subplots()
bp = ax.boxplot(data, labels=labels, patch_artist=True)
ax.set_title('Box plot with mean')
# 添加均值线
colors = ['red', 'blue', 'green', 'purple']
for i, box in enumerate(bp['boxes']):
# 箱子
box.set(facecolor=colors[i % len(colors)])
# 上边和下边的横线
bp['medians'][i].set(color='black')
bp['caps'][i*2].set(color='black')
bp['caps'][i*2+1].set(color='black')
# 均值线
avg_val = np.mean(data[:, i])
ax.axhline(avg_val, color='orange', ls='--', lw=2)
plt.show()
该代码创建了一个带有均值线的箱线图
下面我们解释一下代码:
- 我们首先定义了四种颜色,用来给每个箱子着色;
- 然后,我们在每个箱子上设置了颜色,并将参数patch_artist设置为True,使得箱子可以被填充;
- 接着,我们分别设置了上边和下边的黑色横线;
- 之后,我们用mean函数计算了每组数据的均值,并在箱子上方添加了一条橙色的均值线。
方法二:同时绘制箱线图和折线图
另一种能同时表示均值和箱线图的方式是绘制一个在箱子上的折线图,再网上添加均值点。下面是示例代码:
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(1)
data = np.random.normal(size=(100, 4))
labels = ['A', 'B', 'C', 'D']
fig, ax = plt.subplots()
bp = ax.boxplot(data, labels=labels, patch_artist=True)
ax.set_title('Box plot with mean')
# 添加均值线
colors = ['red', 'blue', 'green', 'purple']
for i, box in enumerate(bp['boxes']):
# 箱子
box.set(facecolor=colors[i % len(colors)])
# 上边和下边的横线
bp['medians'][i].set(color='black')
bp['caps'][i*2].set(color='black')
bp['caps'][i*2+1].set(color='black')
# 折线
avg_val = np.mean(data[:, i])
ax.plot(i+1, avg_val, marker='o', markerfacecolor='orange', markersize=10, markeredgecolor='black')
plt.show()
该代码也创建了一个带有均值线的箱线图
本方法在绘制箱线图时,对于每个箱子,分别在其上方绘制均值点,横坐标设为该箱子的位置加1。可以看到,折线图更能突出各组数据的均值大小。
方法三:利用seaborn进行绘图
除了以上两种方法,我们也可以借助seaborn包中提供的函数实现绘制带均值的箱线图。seaborn是Matplotlib的一个高级封装库,为Matplotlib提供了更加简单易用的API,使得绘图更加简单快捷。
下面是示例代码:
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(1)
data = np.random.normal(size=(100, 4))
labels = ['A', 'B', 'C', 'D']
sns.boxplot(data=data, orient='v', palette='Set2')
# 绘制均值线
for i in range(4):
avg_val = np.mean(data[:, i])
plt.plot([i-0.2, i+0.2], [avg_val, avg_val], color='orange', linewidth=2)
plt.show()
该代码使用了seaborn包中的boxplot函数,绘制了一个带均值的箱线图
在代码中,我们直接调用了seaborn包提供的boxplot函数,设置了数据data和x轴方向的标签labels。然后,我们通过在每个箱子上添加均值点的方式来显示均值。
结论
本文中,我们介绍了三种方法来绘制Python Matplotlib的箱线图并显示其均值。第一种方法是在每个箱子上绘制均值线,第二种方法是同时绘制箱线图和折线图,第三种方法是借助seaborn包中的函数来绘制带均值的箱线图。
总之,不管使用何种方式,在数据分析和可视化中,箱线图都是一种重要的工具,能够对数据分布进行直观的展示,为用户提供更为详细的数据分析结果。