用点包图洞察医学数据:以血压分析为例
在医学数据分析的广袤天地里,可视化手段无疑是我们快速洞察数据、挖掘关键信息的有力 “武器”。今天,就来给各位医学同仁介绍一种别具一格的可视化图表 —— 点包图(Diverging Dotplot),顺便分享一段用 Python 实操绘制它的代码,助你轻松开启数据可视化的新旅程。
点包图为何物?
点包图,本质上是一种散点图的变体,它擅长突出数据点与某个参考值(常是均值)的偏离情况。在医学领域,很多时候我们关心某项生理指标相较于正常范围均值的高低,点包图就能将这类信息直观呈现,让人一眼看清数据的分布态势。
绘制前的准备:环境与数据
咱们使用 Python 里超热门的 pandas
和 matplotlib
库来绘制点包图。pandas
用于数据处理、规整,matplotlib
则负责可视化呈现。
先看看数据,以下这段代码模拟生成了一组简单却很典型的医学数据:
import pandas as pd
import matplotlib.pyplot as plt
# 模拟生成医学数据
data = {
"systolic_bp": [175, 130, 160, 110, 150, 115, 135, 145, 115, 155],
"diastolic_bp": [80, 85, 90, 75, 95, 83, 88, 93, 78, 98],
"health_status": ["normal", "prehypertension", "hypertension stage 1", "normal", "hypertension stage 2",
"prehypertension", "hypertension stage 1", "hypertension stage 2", "normal",
"hypertension stage 3"]
}
df = pd.DataFrame(data)
这里的数据包含病人的收缩压(systolic_bp
)、舒张压(diastolic_bp
),还有对应的健康状态(health_status
),麻雀虽小,五脏俱全,足够咱们开启分析之旅。
绘制点包图:步步为营
数据标准化:要绘制点包图,往往需先把关键数据标准化,让它们能围绕一个基准值(通常是均值,标准化后均值为 0)来分布展示。
# 提取'systolic_bp'列作为x变量,并计算其标准化值
x = df.loc[:, ['systolic_bp']]
df['systolic_bp_z'] = (x - x.mean()) / x.std()
这段代码提取了收缩压数据,算出每一个值相对均值的标准分数,正数意味着高于均值,负数反之。
颜色赋值:依据标准化后的数据点位置,给它们分配不同颜色,这能增强可视化的对比效果。
# 根据'systolic_bp_z'列的值确定颜色
df['colors'] = ['green' if x < 0 else'red' for x in df['systolic_bp_z']]
在这里,低于均值的点标为绿色,高于均值的点则是红色,一目了然区分血压高低情况。
数据排序与索引重置:排序能让点包图看起来更规整,重置索引则是为后续绘图的坐标定位打基础。
df.sort_values('systolic_bp_z', inplace=True)
df.reset_index(inplace=True)
绘图实操:终于到了出图环节。
# 绘制图形
plt.figure(figsize=(10, 5), dpi=200)
plt.scatter(df.systolic_bp_z, df.index, s=450, alpha=0.6, color=df.colors)
scatter
函数绘制散点,横坐标是标准化的收缩压,纵坐标用索引定位,点的大小、透明度、颜色都精心设置,确保视觉效果清晰又美观。
添加标注与美化:给每个点加上具体数值标注,再润色下图表边框、坐标轴标签、网格线等。
# 在每个点上添加'systolic_bp_z'的值作为标签
for x, y, tex in zip(df.systolic_bp_z, df.index, df.systolic_bp_z):
t = plt.text(x, y, round(tex, 1),
horizontalalignment='center',
verticalalignment='center',
fontdict={'color': 'white'})
# 轻化边框
plt.gca().spines["top"].set_alpha(0.3)
plt.gca().spines["bottom"].set_alpha(0.3)
plt.gca().spines["right"].set_alpha(0.3)
plt.gca().spines["left"].set_alpha(0.3)
plt.yticks(df.index, df.health_status)
plt.title('Diverging Dotplot of Systolic Blood Pressure', fontdict={'size': 20})
plt.xlabel('Systolic Blood Pressure (Standardized)')
plt.grid(linestyle='--', alpha=0.5)
plt.xlim(-2.5, 2.5)
plt.show()
医学场景应用
点包图在医学数据分析里大有用武之地。拿血压数据来说,一眼扫过去,我们就能快速锁定哪些病人收缩压偏离正常均值较多,还能结合对应的健康状态,初步判断血压异常和疾病阶段之间的关联。要是拓展到大规模临床研究,分析诸如血糖、血脂等关键指标时,点包图同样能助力医生、研究者迅速梳理出不同亚组人群的指标差异,挖掘潜在的疾病风险因素,为精准医疗、个性化干预方案的制定提供可视化的数据支撑。
掌握点包图绘制,相当于在医学数据解读的 “武器库” 里新添一件趁手的工具,不妨在日常分析里小试身手,说不定能挖出意想不到的关键洞察!