You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为swimplot生成的Swimmer Bar Plot添加ggpattern图案并修复报错?

问题修复:给swimplot泳道图添加ggpattern图案

错误原因

你的代码报错主要有两个问题:

  1. 原始数据缺少阶段起始时间,导致swimmer_plot绘制的是重叠的条形,而非你想要的分段治疗条;
  2. 直接叠加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 12:51:56