R语言ggplot添加geom_segment后facet_wrap分面顺序异常如何解决
原因
分面顺序错乱是因为新增的标注数据框中day字段为字符类型,未和主数据保持一致的因子等级。ggplot2处理分面时会合并所有图层的分面变量,主数据的因子型day和标注数据的字符型day混合后,会被默认统一转为字符类型,按字典序重新排序,导致预设的因子顺序失效。
修复方法
方案1:单独转换每个标注数据的day字段
先定义统一的因子等级,构造标注数据时直接转成对应因子:
# 定义和主数据一致的day因子等级 day_levels <- c("7 dpi","3 dpi","14 dpi", "21 dpi") anno1.1 <- data.frame( day=factor("3 dpi", levels = day_levels), x=c(1, 1, 2), xend=c(2, 1, 2), y=c(5, 5, 5), yend=c(5, 4.85, 4.85)) anno2.1 <- data.frame( day=factor("7 dpi", levels = day_levels), x=c(2, 2, 6), xend=c(6, 2, 6), y=c(5, 5, 5), yend=c(5, 4.85, 4.85)) anno3.1 <- data.frame( day=factor("14 dpi", levels = day_levels), x=c(2, 2, 6), xend=c(6, 2, 6), y=c(5, 5, 5), yend=c(5, 4.85, 4.85))
之后保持原有的绘图代码不变即可。
方案2:合并标注数据后统一转换
如果标注数据较多,可先合并再统一转换因子,同时还能简化绘图代码:
# 合并所有标注数据 anno_all <- rbind(anno1.1, anno2.1, anno3.1) # 统一转换day为指定等级的因子 anno_all$day <- factor(anno_all$day, levels = c("7 dpi","3 dpi","14 dpi", "21 dpi")) # 绘图时仅需调用一次geom_segment Test + geom_segment(data = anno_all, aes(x = x, y = y, xend=xend, yend=yend), inherit.aes = FALSE)+ theme_classic()
内容的提问来源于stack exchange,提问作者Rezious
相关产品推荐
相关产品推荐

