使用两样本 t 检验结果绘制森林图

Python
可视化
森林图
zepid
Author

Rui

Published

September 16, 2022

在进行多次 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)。其中:

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()

如果想要更进一步美化森林图,则需要做更多设置。

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()