如何用ggplot绘制包含BMI、体重变化与相对风险(RR)的单图?
用ggplot2绘制BMI、体重变化与相对风险(RR)的关联图
首先,ggplot2要求数据为长格式(tidy data),你当前的矩阵是宽格式,所以第一步需要转换数据结构。以下是完整实现步骤:
1. 加载所需R包
library(ggplot2) library(tidyr) # 用于数据格式转换
2. 将宽格式矩阵转换为长格式
把矩阵转为数据框后,用pivot_longer将BMI列转为单独变量:
# 保留行名作为体重变化分组,转成宽转长格式 chd_df <- as.data.frame(chd.wt) %>% mutate(weight_change = rownames(chd.wt)) %>% pivot_longer(cols = -weight_change, names_to = "bmi_category", values_to = "rr")
转换后的数据结构示例:
| weight_change | bmi_category | rr |
|---|---|---|
| gained 20 kg | <19 | 3.0 |
| gained 20 kg | 19-20.3 | 2.9 |
3. 用ggplot2绘制可视化图表
推荐两种适配论文需求的可视化方式:
方式一:热图(适合对比RR分布)
用颜色深浅表示RR值,清晰展示不同分组的风险差异:
ggplot(chd_df, aes(x = bmi_category, y = weight_change, fill = rr)) + geom_tile(color = "white") + # 白色边框区分区块 geom_text(aes(label = rr), color = "black", size = 4) + # 标注RR数值 scale_fill_gradient(low = "#f7fbff", high = "#08306b") + # 设置颜色渐变 labs(x = "BMI区间", y = "体重变化分组", fill = "相对风险(RR)", title = "体重变化与BMI对冠心病相对风险的影响") + theme_minimal() + theme(axis.text.x = element_text(angle = 45, hjust = 1)) # 旋转x轴标签避免重叠
方式二:点图(适合观察趋势)
用点的大小和颜色同时表示RR值,更易捕捉风险变化趋势:
ggplot(chd_df, aes(x = bmi_category, y = weight_change)) + geom_point(aes(size = rr, color = rr), alpha = 0.8) + scale_color_gradient(low = "#fee0d2", high = "#de2d26") + labs(x = "BMI区间", y = "体重变化分组", size = "相对风险(RR)", color = "相对风险(RR)", title = "体重变化与BMI对冠心病相对风险的影响") + theme_bw() + theme(axis.text.x = element_text(angle = 45, hjust = 1))
补充说明
- 长格式是ggplot2的核心要求,确保每个变量对应一列数据;
- 两种图表可根据论文的表达重点选择,热图侧重分组对比,点图侧重趋势观察;
- 可通过调整
scale_fill_gradient/scale_color_gradient的颜色参数匹配论文配色风格。
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

