ggplot中geom_segment意外交叉问题求助
问题:geom_segment线段交叉异常,前两个y变量错位,其余正常
我搞不懂为什么geom_segment在我的前两个y变量上出现交叉,剩下的变量都正常。geom_points在这两个变量上显示都是对的,暂时没法提供数据框,有人能分析下问题出在哪吗?
data %>% ggplot() + aes(y = fct_reorder2(lang, year, -mean), x = mean) + geom_errorbar(data = twenty16, xmin = twenty16$mean - twenty16$ci, xmax = twenty16$mean + twenty16$ci, width = 0.4, colour = "#aeb6bf")+ geom_point(colour = factor(year), size = 4) + theme_minimal()+ theme(text = element_text(family = "hel" ), axis.text = element_text(size = 12), axis.title = element_text(size = 15), title = element_text(size = 15))+ geom_segment(data = twenty06, arrow = arrow(length = unit(0.02, "npc"), type ="closed"), lineend = 'round', linejoin = "mitre", aes( x = mean, y = lang, xend = twenty16$mean, yend = twenty16$lang) )+ labs(title = "Percent of learners reaching the low international Benchmark \n by language, 2006 to 2016 with 90% CIs", y = "Languages", x = "Percent", legend = "Year")

原因分析
两个数据框的
lang顺序不匹配:主图层用fct_reorder2(lang, year, -mean)对语言重新排了序,但geom_segment用到的twenty06和twenty16是单独的数据框,它们的lang列还是原始顺序,没跟着主图层的排序同步。你直接用twenty16$lang当yend时,ggplot会按原始字符串匹配位置,不是按排序后的位置对应,导致前两个语言的线段错位交叉。直接引用外部数据框列的写法有问题:代码里
geom_errorbar和geom_segment都直接用twenty16$mean这种硬编码方式,绕过了ggplot的自动映射逻辑,很容易出现数据匹配错误。正确的做法是让ggplot通过aes自动关联数据,而不是手动引用外部列。可行的解决方向:
- 把
twenty06和twenty16合并成一个长格式数据框,用year区分年份,这样主图层的排序会统一应用到所有数据上。 - 如果要分开用数据框,提前对
twenty06和twenty16的lang列做同样的fct_reorder2排序,保证顺序和主图层一致。 - 在
geom_segment的aes里,不要直接用twenty16$xxx,而是通过lang的映射让ggplot自动匹配对应行的数值,比如可以用xend = mean[lang == .env$lang]这种方式(但合并数据是更稳妥的方案)。
- 把
内容的提问来源于stack exchange,提问作者Peter Courtney
相关产品推荐
相关产品推荐

