如何为swimplot生成的Swimmer Bar Plot添加ggpattern图案并修复报错?
问题修复:给swimplot泳道图添加ggpattern图案
错误原因
你的代码报错主要有两个问题:
- 原始数据缺少阶段起始时间,导致swimmer_plot绘制的是重叠的条形,而非你想要的分段治疗条;
- 直接叠加
geom_col_pattern时,它的数据源、美学映射(x/y轴)和swimmer_plot内部生成的图层不匹配,触发了美学计算错误。
修复步骤与代码
第一步:修正数据源
先给数据补充start_yr列,明确每个治疗阶段的起始时间(即前一阶段的结束时间):
library(swimplot) library(ggplot2) library(ggpattern) df <- data.frame( study_id = c(3, 3, 3), primary_therapy = c("Si", "Si", "Si"), additional_treatment = c("NA", "S", "V+S"), start_yr = c(0, 0.08, 0.39), # 新增:每个阶段的起始时间 end_yr = c(0.08, 0.39, 3.03) )
第二步:两种修复方案
方案1:修改swimmer_plot的默认图层
swimmer_plot底层用geom_rect绘制条形,我们直接把它替换成ggpattern的geom_rect_pattern,保留原有样式并添加图案映射:
# 生成基础泳道图 p <- swimmer_plot( df = df, id = "study_id", start = "start_yr", # 指定起始时间列 end = "end_yr", name_fill = "primary_therapy", width = 0.85, color = NA ) # 替换默认的geom_rect为geom_rect_pattern,添加图案映射 p$layers[[1]] <- geom_rect_pattern( aes(pattern = additional_treatment, pattern_angle = additional_treatment), data = p$data, fill = p$layers[[1]]$aes_params$fill, color = p$layers[[1]]$aes_params$color, width = p$layers[[1]]$aes_params$width ) # 自定义图案样式(可选) p + scale_pattern_manual(values = c("none", "stripe", "crosshatch")) + scale_pattern_angle_manual(values = c(0, 45, 90))
方案2:手动构建ggplot(更灵活)
如果不想依赖swimmer_plot的封装,直接用geom_rect_pattern手动绘制泳道图,完全自定义样式:
ggplot(df, aes( x = factor(study_id), ymin = start_yr, ymax = end_yr, xmin = as.numeric(factor(study_id)) - 0.425, # 对应width=0.85的左右边界 xmax = as.numeric(factor(study_id)) + 0.425 )) + geom_rect_pattern( aes(fill = primary_therapy, pattern = additional_treatment, pattern_angle = additional_treatment), color = NA ) + scale_y_continuous(name = "时间(年)") + scale_x_discrete(name = "患者ID") + scale_pattern_manual(values = c("none", "stripe", "crosshatch")) + scale_pattern_angle_manual(values = c(0, 45, 90)) + theme_bw()
关键说明
swimmer_plot内部会把数据转换成geom_rect需要的xmin/xmax/ymin/ymax格式,而geom_col_pattern默认用x/y美学,两者不兼容,所以必须用同类型的geom_rect_pattern来替换或叠加,才能正确映射图案属性。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

