如何在R中绘制同一图展示3个时间点BMI与HTN的变化趋势
R实现两个指标趋势可视化及画布整合方案
完全可以在R中实现该需求,也支持将两个指标的图形整合到同一张画布,以下是可直接运行的实现代码:
1. 依赖包安装与数据构造
# 未安装依赖包先运行下行安装命令 # install.packages(c("tidyverse", "patchwork")) library(tidyverse) library(patchwork) # 构造样本数据集 df <- data.frame( ID = c("A1", "A2", "A3", "A4"), BMI_1 = c(35,29,38,33), BMI_2 = c(37,32,39,34), BMI_3 = c(40,35,42,34), HTN_1 = c(0,0,1,0), HTN_2 = c(0,1,1,0), HTN_3 = c(1,1,1,0) )
2. 数据格式转换(宽表转长表)
# 转换BMI长表,保留个体维度,用于绘制个体折线 bmi_long <- df %>% select(ID, starts_with("BMI")) %>% pivot_longer(cols = -ID, names_to = "time", values_to = "BMI") %>% mutate(time = as.numeric(str_remove(time, "BMI_"))) # 转换HTN长表,按时间点聚合计算患病人数(HTN=1的计数) htn_long <- df %>% select(ID, starts_with("HTN")) %>% pivot_longer(cols = -ID, names_to = "time", values_to = "HTN") %>% mutate(time = as.numeric(str_remove(time, "HTN_"))) %>% group_by(time) %>% summarise(htn_count = sum(HTN == 1))
3. 绘图与画布整合
# 绘制BMI个体折线图 p1 <- ggplot(bmi_long, aes(x = time, y = BMI, color = ID, group = ID)) + geom_line(linewidth = 1) + geom_point(size = 2) + scale_x_continuous(breaks = 1:3, labels = paste0("时间点",1:3)) + labs(x = "时间点", y = "BMI值", title = "BMI随时间变化趋势") + theme_bw() # 绘制HTN计数柱状图 p2 <- ggplot(htn_long, aes(x = factor(time, levels = 1:3, labels = paste0("时间点",1:3)), y = htn_count)) + geom_col(fill = "steelblue", alpha = 0.7) + geom_text(aes(label = htn_count), vjust = -0.3) + labs(x = "时间点", y = "HTN阳性人数", title = "HTN计数随时间变化趋势") + theme_bw() # 两张图上下排布整合到同一张画布 p1 / p2 # 如需左右排布改为下行即可 # p1 + p2
补充说明
- 若不需要展示个体BMI的变化,仅需展示群体BMI均值趋势,可对
bmi_long按时间分组求均值后再绘图 - 也可通过双Y轴方式将两个指标整合到同一个坐标系,不过更推荐分离子图的形式,避免双Y轴带来的解读歧义
内容的提问来源于stack exchange,提问作者Sana
相关产品推荐
相关产品推荐

