如何用ggplot为交叉研究受试者生成带ID的单独叠加处理图
为每个受试者生成单独的浓度曲线叠加图
方法概述
要实现每个受试者单独的图形并叠加T、R两种处理的结果,可通过两种方式实现:
- 分面图:一次性生成所有受试者的图形面板,便于整体对比
- 单独文件:为每个受试者生成独立的图形文件,适合单独查看或报告使用
代码实现
方式1:生成分面图(所有受试者在同一画布)
这种方式无需循环,利用ggplot2的分面功能快速生成所有受试者的图形:
library(ggplot2) # 绘制分面图,每个分面对应一个受试者 subject_facet_plot <- ggplot(Totalplot, aes(x = time, y = conc, color = drug)) + # 添加数据点 geom_point(alpha = 0.5, shape = 2) + # 添加曲线,忽略NA值避免曲线中断 geom_line(linewidth = 0.5, na.rm = TRUE) + # 设置坐标轴标签 xlab('时间 (h)') + ylab('血浆药物X浓度 (ng/ml)') + # 设置标题和图例名称 labs(title = '各受试者血浆药物浓度曲线', color = '处理组') + # 按受试者ID分面,可调整列数(ncol) facet_wrap(~subj, ncol = 2) + # 使用简洁的主题,并增强受试者ID的显示效果 theme_bw() + theme(strip.text = element_text(size = 12, face = 'bold')) # 显示图形 print(subject_facet_plot)
方式2:生成单独的图形文件(每个受试者一个文件)
如果需要为每个受试者保存独立的图形文件,可结合dplyr和purrr实现循环生成:
library(ggplot2) library(dplyr) library(purrr) # 获取所有唯一的受试者ID subject_ids <- unique(Totalplot$subj) # 循环处理每个受试者 walk(subject_ids, function(id) { # 筛选当前受试者的数据 subj_data <- filter(Totalplot, subj == id) # 绘制当前受试者的图形 subj_plot <- ggplot(subj_data, aes(x = time, y = conc, color = drug)) + geom_point(alpha = 0.5, shape = 2) + geom_line(linewidth = 0.5, na.rm = TRUE) + xlab('时间 (h)') + ylab('血浆药物X浓度 (ng/ml)') + # 标题中包含受试者ID labs(title = paste('受试者', id, '血浆药物浓度曲线'), color = '处理组') + theme_bw() # 保存图形,文件名包含受试者ID ggsave(filename = paste0('subject_', id, '_concentration_plot.png'), plot = subj_plot, width = 6, height = 4, dpi = 300) })
关键说明
- 无需对数据进行分组汇总:直接使用原始数据即可保留每个受试者的个体数据
- 处理NA值:在
geom_line中添加na.rm = TRUE,避免因缺失值导致曲线中断 - 自定义样式:可根据需求调整图形的大小、颜色、主题等参数
内容的提问来源于stack exchange,提问作者Roman Maksvytis
相关产品推荐
相关产品推荐

