如何使用R绘制按受试者ID分组的二值状态随访视变化折线图
解决方案
核心问题修正说明
此前SAS生成图形出现访视轴排序错乱的根本原因是:未将访视变量指定为按时间顺序排列的有序分类变量,程序默认按观测值在数据中出现的先后顺序排列轴标签,才会出现00、02、03、01的错误顺序。绘图前先固定访视变量的水平顺序,即可彻底解决该问题。
适配数据的可视化选项
1. 个体轨迹折线图(适合小样本量,清晰展示单受试者转归)
你最初设想的「X轴映射访视、Y轴映射疾病状态、每个受试者单独绘制轨迹」的思路完全适配这类纵向二值随访数据,搭配点标注每次访视的实际状态,可读性很强。
R实现代码(基于ggplot2):
# 加载绘图包 library(ggplot2) # 读入示例数据 ID<-c(001, 001, 001, 001, 002, 002, 002, 002, 003, 003, 004, 004, 004, 005, 005, 005, 005, 006, 007, 007, 008, 008, 008, 009, 009, 009, 009, 010, 011, 011) Visit<-c(00, 01, 02, 03, 00, 01, 02, 03, 01, 02, 00, 02, 03, 00, 01, 02, 03, 02, 00, 01, 00, 02, 03, 00, 01, 02, 03, 00, 01, 03) Status<- c(0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1) data<-data.frame(ID,Visit, Status) # 数据预处理:从根源解决排序问题 data$ID <- factor(sprintf("%03d", data$ID)) # 格式化ID为3位字符,避免ID排序错误 data$Visit <- factor(sprintf("%02d", data$Visit), levels = c("00","01","02","03")) # 固定访视水平顺序,彻底解决轴错乱 data$Status <- factor(data$Status, levels = c(0,1), labels = c("未患病","患病")) # 绘制分面个体轨迹图 ggplot(data, aes(x = Visit, y = Status, group = 1)) + geom_line(linewidth = 1) + geom_point(size = 2) + facet_wrap(~ID, ncol = 4) + # 按ID分面,可自行调整列数 scale_y_discrete(breaks = c("未患病","患病")) + labs(x = "访视编号", y = "疾病状态", title = "各受试者访视期间疾病状态变化") + theme_bw()
注意:代码中
group=1是因为每个分面内只有一个受试者的轨迹,必须指定分组才能正确绘制折线。缺失访视的位置会自动留空,不会打乱轴顺序。
2. 状态热图(适合大样本量,快速浏览整体转归规律)
如果后续纳入受试者数量较多,分面折线图会出现分面过多、浏览效率低的问题,可改用热图形式:行对应受试者、列对应访视、单元格颜色映射疾病状态,能同时展示上百个受试者的转归轨迹,不会出现重叠杂乱问题。
实现代码:
ggplot(data, aes(x = Visit, y = ID, fill = Status)) + geom_tile(color = "white", linewidth = 0.5) + scale_fill_manual(values = c("未患病" = "#91bfdb", "患病" = "#fc8d59")) + labs(x = "访视编号", y = "受试者ID", fill = "疾病状态", title = "各受试者访视期间疾病状态热图") + theme_bw()
如果需要在热图上叠加转归连线,也可以搭配geom_line()实现,兼顾整体分布和个体轨迹的展示。
内容的提问来源于stack exchange,提问作者R. Simian
相关产品推荐
相关产品推荐

