如何在facet_wrap分组内用geom_path连接偏移(dodged)的分组点
解决方法
问题核心是x轴变量选择和分组逻辑不匹配:你当前把Treatment设为x轴,每个Treatment对应的x位置上有两个Year的点,geom_path按Treatment分组时,只能在同一x位置连接两点,所以出现垂直路径。下面提供两种可行方案:
方案1:将Year设为x轴(推荐)
把x轴换成Year,让同一Treatment的两个时间点处于不同x位置,再通过position_dodge让同一Year下的不同Treatment点偏移,这样路径就能正确连接同一Treatment的时间轨迹:
library(ggplot2) library(stringr) set.seed(123) # 固定随机数保证结果可复现 df <- data.frame (Treatment = c("Drill_Herb", "Drill_Herb", "Drill_None", "Drill_None", "Herb_None","Herb_None", "Herb_Drill", "Herb_Drill"), Comparison_Combo = c("Drill_Herb_TO_Drill_None", "Drill_Herb_TO_Drill_None", "Herb_None_TO_Herb_Drill", "Herb_None_TO_Herb_Drill"), Ratio = sample(1:8, 8, replace=FALSE), Year = c("2017", "2021","2017", "2021","2017", "2021","2017", "2021")) ggplot(df, aes(x=Year, y=Ratio, shape=Treatment, color=Treatment)) + facet_wrap(~Comparison_Combo, drop = TRUE, scales = "free_x", nrow = 1) + geom_point(size=3.5, position=position_dodge(width=0.55))+ geom_path(aes(group=Treatment), lwd=1, position=position_dodge(width=0.55))
关键调整:
- x轴改为
Year,让每个时间点对应独立的x位置 shape/color映射到Treatment,方便区分不同处理组geom_path保持group=Treatment,配合position_dodge让路径和偏移后的点位置对应
方案2:手动计算x轴偏移量(保留Treatment为x轴)
如果必须把Treatment作为x轴,可手动给不同Year的点添加x偏移,再按Treatment分组绘制路径:
library(ggplot2) set.seed(123) df <- data.frame (Treatment = c("Drill_Herb", "Drill_Herb", "Drill_None", "Drill_None", "Herb_None","Herb_None", "Herb_Drill", "Herb_Drill"), Comparison_Combo = c("Drill_Herb_TO_Drill_None", "Drill_Herb_TO_Drill_None", "Herb_None_TO_Herb_Drill", "Herb_None_TO_Herb_Drill"), Ratio = sample(1:8, 8, replace=FALSE), Year = c("2017", "2021","2017", "2021","2017", "2021","2017", "2021")) # 手动计算偏移量:0.275是position_dodge(width=0.55)的一半 df$x_pos <- as.numeric(factor(df$Treatment)) + ifelse(df$Year == "2017", -0.275, 0.275) ggplot(df, aes(x=x_pos, y=Ratio, shape=Year)) + facet_wrap(~Comparison_Combo, drop = TRUE, scales = "free_x", nrow = 1) + geom_point(size=3.5)+ geom_path(aes(group=Treatment), lwd=1) + # 替换x轴标签为Treatment名称 scale_x_continuous(breaks=unique(as.numeric(factor(df$Treatment))), labels=unique(df$Treatment))
内容的提问来源于stack exchange,提问作者Chad Kluender
相关产品推荐
相关产品推荐

