Matplotlib 统计注释说明如何插入(星号或p值)
在统计数据可视化中,注释的使用是非常重要的—有时甚至是必不可少的。Matplotlib是一个功能强大的数据可视化库,其提供了多种方法用于添加注释,包括利用文本、箭头、注释框等等。尤其是对于一些统计学图表,如箱线图、散点图和直方图等,如果能进一步注释数据分布特征,或通过星号或P值说明显著性差异,就可以使得图表更加精确和易懂。
阅读更多:Matplotlib 教程
文本注释
Matplotlib的基础是通过添加各种艺术家对象来构建图形。文本注释就是其中一种可以被添加到图像中的艺术家对象。文本注释可以使用text()函数,它可以放置在任意位置。在添加文本注释时,我们有一些常用的关键字参数可以调整字体、颜色和对齐等属性。例如,下面的代码显示了如何将文本注释添加到散点图中:
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [1, 2, 3, 4, 5]
plt.scatter(x, y)
plt.text(x[0], y[0], 'Point 1')
plt.text(x[1], y[1], 'Point 2', ha='center', va='bottom')
plt.text(x[2], y[2], 'Point 3', ha='left', va='top')
plt.text(x[3], y[3], 'Point 4', ha='right', va='baseline')
plt.text(x[4], y[4], 'Point 5', rotation=45)
plt.show()
另一种常用的文本注释方法是使用annotate()函数,与text()函数类似但可以附上一条带箭头的线连接两点。下面的代码展示了如何在箱线图上添加带有文本注释和注释线的矩形框:
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(123)
data = [np.random.normal(0, std, 100) for std in range(1, 4)]
plt.boxplot(data)
plt.annotate('Outlier', xy=(1, 2), xytext=(2, 4), arrowprops=dict(facecolor='black', shrink=0.05))
plt.annotate('Median', xy=(2, 0.5), xytext=(2.5, 0.2), bbox=dict(boxstyle='round,pad=0.3', fc='lightgrey', alpha=0.5), arrowprops=dict(facecolor='black', shrink=0.05))
plt.annotate('95% Confidence interval', xy=(3, 3), xytext=(3.2, 3.2), bbox=dict(boxstyle='square,pad=0.3', fc='lightblue', alpha=0.5), arrowprops=dict(facecolor='black', shrink=0.05))
plt.show()
星号注释
在统计学中,我们通常关注差异是否显著。方法之一是计算p值,p值表示假设检验中得到观察到数据的概率,当p值小于0.05时通常被认为是显著的差异。另一种方法是使用星号注释,它是一种不显著(NS)、显著(*)”、“高度显著(**)、非常显著(***)等标记符号的表现方式。
使用Matplotlib实现星号标记注释的方法相对较复杂,需要先定义所需的标记符号,然后插入到图中。下面的代码演示了如何将星号标记进行自定义再添加至柱状图中:
import matplotlib.pyplot as plt
def pvalue_to_asterisks(pvalue):
if pvalue < 0.0001:
return "****"
elif pvalue < 0.001:
return "***"
elif pvalue < 0.01:
return "**"
elif pvalue < 0.05:
return "*"
else:
return ""
x = ['A', 'B', 'C', 'D']
y = [0.2, 0.4, 0.7, 0.9]
p_values = [0.05, 0.001, 0.0001, 0.3]
fig, ax = plt.subplots()
bars = ax.bar(x, y)
for bar, p_value in zip(bars, p_values):
ax.text(bar.get_x() + bar.get_width() / 2, bar.get_height() + 0.05, pvalue_to_asterisks(p_value), ha='center')
plt.show()
注意,在添加星号标记时,我们需要确定标记的位置和大小,并使用text()函数添加星号文本。在此示例中,我们在每个柱状图中心添加了星号。
P值注释
除了星号注释之外,还可以使用P值直接注释数据之间的显著性差异。在Matplotlib中有几种方法可以实现这一点。
一种方法是使用scipy.stats包中的ttest_ind()函数计算两组样本的p值,然后使用文本注释或文本框的形式在图上展示p值。下面的代码演示了如何将两组样本的p值添加到直方图中:
import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import ttest_ind
np.random.seed(123)
a = np.random.normal(0, 1, 100)
b = np.random.normal(1.5, 1, 100)
t, p = ttest_ind(a, b)
plt.hist(a, alpha=0.5)
plt.hist(b, alpha=0.5)
plt.text(0, 40, f"p-value: {p:.3f}", bbox=dict(boxstyle='round,pad=0.3', fc='lightgrey', alpha=0.5))
plt.show()
另一种方法是使用mplstat软件包中的annotate_diff()函数直接在图上绘制带背景色的数据差异,并将p值显示为注释。下面的代码演示了如何将数据的显著性差异用带颜色的箭头形式进行标记:
import matplotlib.pyplot as plt
import numpy as np
from mplstat.stats import annotate_diff
np.random.seed(123)
a = np.random.normal(0,1, 100)
b = np.random.normal(1.5, 1, 100)
fig, ax = plt.subplots()
ax.boxplot([a, b])
annotate_diff(ax, 0, 1, np.mean(a), np.mean(b), "p-value: {:.3f}".format(p), color='red', ha='center', fontsize=12)
plt.show()
这里我们使用annotate_diff()函数绘制了一个箭头,将两组数据间的显著性差异标记出来,并将p值作为注释显示出来。由于此函数比较实用,它可以快速绘制有意义的差异,并添加p-值注释。
总结
本文中,我们介绍了如何在Matplotlib中进行统计注释,包括文本注释、星号注释和p值注释。其中文本注释是最常见的注释方法,我们可以使用text()或annotate()函数在图标中添加文字说明。星号注释可以使用自定义函数将p值转化为符号,然后使用text()函数将其添加到图表中。P值注释可以通过计算两组数据的p值并使用text()函数或使用mplstat软件包中的annotate_diff()函数来添加直接的p值差异注释。这些注释方法都可以用于描绘统计图表,并更好地解释数据特征和差异。
极客笔记