如何用 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,则需相应调整数据映射和分组方式。
备注:内容仅供参考。
