PAYATHON 2026

如何用 ggpattern 为 RPE1 柱形添加斜线并正确分组?

数据阿明

结论

不要用 group = HAP 把同一 HAP 下的 RPE1 和 H9 行合并为一组。每个 CHR 下有两种 ID 和两种 HAP,因此应按 ID 和 HAP 的组合分组,再用 position_dodge() 并排绘制。这样每根柱形都会单独绘制,pattern = ID 也能分别应用于 RPE1 和 H9。

问题描述提到了示意图,但没有附图。以下设置根据文字描述给出。

调整分组和图案

将原来的 aes(group = HAP, pattern = ID) 改为:

aes(
  group = interaction(ID, HAP),
  pattern = ID
)

将原绘图代码中的图层和图案比例尺调整为:

ggplot(rpe1_h9, aes(x = CHR, y = `Length (in Mbps)`, fill = HAP)) +
  geom_col_pattern(
    aes(
      group = interaction(ID, HAP),
      pattern = ID
    ),
    position = position_dodge(width = 0.9),
    alpha = 0.5,
    color = "black",
    pattern_fill = "black",
    pattern_color = "black",
    pattern_angle = 45,
    pattern_spacing = 0.025
  ) +
  scale_pattern_manual(
    values = c(H9 = "none", RPE1 = "stripe"),
    breaks = c("H9", "RPE1"),
    drop = FALSE
  ) +
  guides(
    pattern = guide_legend(
      ncol = 1,
      order = 1,
      override.aes = list(fill = "white", color = "black")
    ),
    fill = guide_legend(ncol = 1, order = 2)
  )

将这些部分合并到原有绘图代码中即可。原来的主题和 scale_fill_manual() 等设置可以保留。

参数说明

  • group = interaction(ID, HAP) 会为每个 ID 和 HAP 组合建立独立的柱形组。当前数据在每个 CHR 下有四种组合。调整 position_dodge(width = 0.9) 中的 width 可以改变柱形间距。
  • pattern = ID 会将 RPE1 和 H9 分别映射到图案比例尺。"none" 表示 H9 不绘制图案,"stripe" 表示 RPE1 使用斜线。
  • pattern_spacing 控制条纹间距。数值越小,条纹越密。可以从 0.025 开始,根据图形效果微调。要让线条更明显,可以再设置 pattern_density。
  • breaks 与 drop = FALSE 会保留图例中的 H9 和 RPE1 项。override.aes 会让图例键使用白色填充和黑色边框。如果当前安装的 ggpattern 版本显示图例键的方式不同,可以移除这项,单独检查图例。

条纹应限制在对应柱形内。如果条纹仍跨过相邻柱形,先确认图层中已删除 group = HAP,再检查每个 CHR 下的 ID 和 HAP 组合是否符合预期。interaction(ID, HAP) 会让不同组合分别错位。如果希望每个 ID 只占一个位置,不再用独立柱形区分 HAP,则需相应调整数据映射和分组方式。

备注:内容仅供参考。