在进行多次 t 检验(包括两样本独立 t 检验、配对样本 t 检验甚至是回归分析中针对多个系数的 t 检验等),应该如何清晰直白地展现假设检验地结果呢?森林图是一个好方法。
参考:https://zepid.readthedocs.io/en/latest/Reference/Graphics.html?highlight=EffectMeasure#zepid.graphics.graphics.EffectMeasurePlot
Code
import pandas as pd
Data = pd.read_csv('F:/RuiBlog/posts/Python/森林图/data/性别T检验.CSV' ,
index_col = 0 , encoding = "gbk" ) # 导入数据,将第一列设置为索引
Data
平均值差值
下限
上限
自身行为
ACE
0.006
-0.091
0.104
RCE
0.011
-0.092
0.115
SBR
-0.131
-0.245
-0.017
ASI
0.077
-0.051
0.205
AO
0.025
-0.088
0.139
GT
0.039
-0.064
0.142
EV
0.175
0.033
0.317
PAE
0.117
0.004
0.230
PNB
0.085
-0.046
0.217
PEK
0.020
-0.107
0.147
表格中第一列代表十种不同类型的自身行为的缩写,第二列表示男性、女性在各种自身行为水平上的差值,最后两列代表两样本 t 检验的置信区间的下限和上限。其中 t 检验可以用很多方式实现:SPSS、SAS、R 或者 Python 等,这里不做展开。这张表是经过 t 检验后汇总得出的表,在移植到其他项目的时候也务必保证表的格式相同,这样才能顺利地将参数传入函数中。
Code
import matplotlib.image as mpimg
import numpy as np
import matplotlib.pyplot as plt
import zepid
from zepid.graphics import EffectMeasurePlot
plt.rcParams['font.family' ] = ['SimHei' ]
plt.rcParams['axes.unicode_minus' ] = False # 正常显示负号
绘制森林图的核心库为 zepid ,同时还需要 matplotlib
配合作图。zepid
绘制森林图地核心函数是 EffectMeasurePlot(label, effect_measure, lcl, ucl)
。其中:
label
:各项 t 检验的标签,本例中为十种自身行为的缩写,也就是表格中的第一列;
effect_measure
:两样本 t 检验的水平值差值,本例中为男女在不同自身行为上的水平差值,即表格的第二列;
lcl
和 ucl
:分别表示两样本 t 检验的置信区间的下界和上界,即表格中的最后两列。
Code
labs = Data.index.tolist()
labs
['ACE', 'RCE', 'SBR', 'ASI', 'AO', 'GT', 'EV', 'PAE', 'PNB', 'PEK']
Code
measure = Data["平均值差值" ].values.tolist()
lower = Data["下限" ].values.tolist()
upper = Data["上限" ].values.tolist()
可以将以上参数传入函数中,可以得到一个简约版的森林图:
Code
p = EffectMeasurePlot(label= labs, effect_measure= measure, lcl= lower, ucl= upper)
p.labels(effectmeasure= "平均值差值" , center= 0 )
p.colors(pointshape= "D" )
ax = p.plot(figsize= (10 , 8 ), t_adjuster= 0.04 , min_value=- 0.35 , max_value= 0.35 )
plt.show()
p.labels(effectmeasure="平均值差值", center=0)
设置 effectmeasure
的名称为“平均值差值”,center=0
设置 x=0 处的垂直辅助线;
p.colors(pointshape="D")
设置点的形状为菱形(D 代表 Diamond);
p.plot(figsize=(10, 8), t_adjuster=0.04, min_value=-0.35, max_value=0.35)
主要用于全局的设置。其中 figsize
指定图像的大小;t_adjuster
用于调整“平均值差值”这一标签的相对位置,其取值需要多次尝试才能确定;min_value
和 max_value
设置 x 轴的范围。
如果想要更进一步美化森林图,则需要做更多设置。
Code
p = EffectMeasurePlot(label= labs, effect_measure= measure, lcl= lower, ucl= upper)
p.labels(effectmeasure= "平均值差值" , center= 0 )
p.colors(pointshape= "D" )
ax = p.plot(figsize= (10 , 8 ), t_adjuster= 0.04 , min_value=- 0.35 , max_value= 0.35 )
plt.title("t检验结果" , loc= "right" , fontsize= 14 , x= 0.65 , y= 1.05 )
plt.suptitle("自身行为" , fontsize= 14 , x= 0.11 , y= 0.92 )
ax.set_xlabel(" {: ^40} " .format ("女性更高 男性更高" ), fontsize= 12 )
ax.spines['top' ].set_visible(False )
ax.spines['right' ].set_visible(False )
ax.spines['bottom' ].set_visible(True )
ax.spines['left' ].set_visible(False )
plt.show()
plt.title
和 plt.subtitle
分别设置森林图的主标题与副标题的名称、位置、字体大小。一般而言,可以将副标题设置为左侧各类检验的总标题,主标题既可以设置在图像的中间作为整幅图的主标题,也可以设置在右侧作为数值一栏的总标题;
ax.set_xlabel
用于设置 x 轴的标签名称以及字体大小;
ax.spines['top'].set_visible(False)
隐藏森林图上方的边界线,其他位置 ‘bottom’,‘left’ 和 ‘right’ 的设置亦是如此。