R语言ggplot分面折线图如何添加灰化对照组参考线
ggplot分面叠加对照组参考线实现
核心操作是在原有图层最底层新增独立的对照组参考线图层,该图层不继承全局的分组颜色、线型映射,固定为浅灰色,会在全部分面中绘制,不会遮挡上层各分面的专属分组图形。
注意你提供的示例数据用cbind生成时会强制把所有列转为字符型,会导致绘图计算错误,需要改用data.frame()构造数据框。
可直接运行的完整代码
library(ggplot2) library(dplyr) # 用于筛选对照组数据,不想加载dplyr可以用基础函数subset筛选 # 1. 修正构造示例数据 sample <- c(1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,8,8,8,9,9,9) group <- c("a","a","a","a","a","a","a","a","a","b","b","b","b","b","b","b","b", "b","c","c","c","c","c","c","c","c","c") bins <-c("0-20","20-40","40-60","0-20","20-40","40-60","0-20","20-40","40-60","0-20","20-40","40-60", "0-20","20-40","40-60", "0-20","20-40","40-60", "0-20","20-40","40-60", "0-20","20-40","40-60", "0-20","20-40","40-60") p_per_bin <- c(0,37.7192982,21.0526316,0,36.744186,23.7209302,0,36.2126246,31.5614618, 0,31.25,27.0833333,0,41.2280702,28.5087719,0,39.6078431,31.372549,0,43.7262357, 20.1520913,0,35.4716981,21.1320755,0,38.5350318, 29.9363057) my_data <- data.frame(sample,group,bins,p_per_bin) # 2. 绘图 graph <- ggplot(data=my_data, aes(x=bins, y=p_per_bin, group = group, color = group, linetype = group, shape = group))+ # 最底层:所有分面共用的对照组浅灰色参考线 stat_summary( data = . %>% filter(group == "a"), # 仅提取对照组a的数据 fun = "mean", geom = "line", lwd = rel(1), color = "lightgrey", # 固定参考线为浅灰色 group = 1, # 取消全局分组映射的影响 inherit.aes = FALSE, # 不继承全局的颜色、线型、形状映射 aes(x = bins, y = p_per_bin) # 单独给参考层指定坐标映射 ) + # 以下为原有代码,无需修改 stat_summary(fun = "mean", geom = "line", lwd = rel(1))+ stat_summary(fun = mean, geom = "pointrange", fun.max = function(x) mean(x) + sd(x) / sqrt(length(x)), fun.min = function(x) mean(x) - sd(x) / sqrt(length(x)))+ stat_summary(fun = "mean", geom = "point", size = rel(2), fill = "white", stroke = rel(1.1)) graph + facet_wrap(~group)
补充说明
- 如果不想加载dplyr用管道符,可以提前用基础R函数筛选对照组数据:
ctrl_data <- subset(my_data, group == "a"),把参考层的data参数替换为ctrl_data即可,效果完全一致。 - 最终效果:对照组a的分面中浅灰参考线和本组折线完全重合,无视觉异常;b、c处理组分面中,底层显示浅灰色的对照组平均折线作为参考,上层保留本组的折线、误差棒、点元素,符合预期。
- 如果需要参考线同步显示误差棒或点,参照参考线层的写法,单独添加对应的
stat_summary层、固定颜色为浅灰色即可。
内容的提问来源于stack exchange,提问作者KCS
相关产品推荐
相关产品推荐

