ggplot双图统一Y轴后交互分组线条消失问题求助
问题解决:设置统一Y轴范围后保留所有loess拟合线
核心原因
你使用的scale_y_continuous(limits=)和ylim()会直接删除超出Y轴范围的数据行,导致部分FAS_cat分组没有可用数据,自然无法生成对应的loess拟合线。coord_cartesian(ylim=)本身不会删除数据,只是视觉上裁剪Y轴,如果用了它还是只剩一条线,大概率是某个分组的loess拟合结果完全落在你设定的1.75-2.75范围之外,或者你把它加在了错误的位置。
解决方案
1. 正确使用coord_cartesian()锁定Y轴范围
把coord_cartesian(ylim = c(1.75, 2.75))添加到每张图的最后,确保它不会影响数据拟合,只是调整显示范围:
library(ggplot2) library(cowplot) # 统一设置颜色映射,避免重复代码 color_map <- scale_color_manual( values = c("Below Average" = "blue", "Average" = "green", "Above Average" = "red"), name = "Family SES categories" ) # 心理症状图 plot_psychological <- ggplot(final_overall, aes(x = surveyyear, y = psycho, color = FAS_cat, group = FAS_cat)) + geom_smooth(method = "loess", span = .8, se = FALSE) + labs( x = "Survey Year", y = "Psychological Complaints", title = "Survey Year vs Psychological Complaints per FAS category" ) + scale_x_continuous(breaks = seq(2002, 2022, by = 4), limits = c(2002, 2022)) + color_map + theme_minimal() + coord_cartesian(ylim = c(1.75, 2.75)) # 放在最后,不影响拟合 # 躯体症状图 plot_somatic <- ggplot(final_overall, aes(x = surveyyear, y = somatic, color = FAS_cat, group = FAS_cat)) + geom_smooth(method = "loess", span = .8, se = FALSE) + labs( x = "Survey Year", y = "Somatic Complaints", title = "Survey Year vs Somatic Complaints per FAS category" ) + scale_x_continuous(breaks = seq(2002, 2022, by = 4), limits = c(2002, 2022)) + color_map + theme_minimal() + coord_cartesian(ylim = c(1.75, 2.75)) # 同样放在最后 # 合并图表 combined_plot <- plot_grid(plot_psychological, plot_somatic, nrow = 1, align = "v") print(combined_plot)
2. 检查分组数据范围
如果用了上述代码还是只有一条线,先检查每个FAS_cat分组的变量取值范围,确认是否有分组的所有数据都在1.75以下或2.75以上:
# 查看psycho变量按FAS_cat分组的范围 aggregate(psycho ~ FAS_cat, data = final_overall, FUN = range) # 查看somatic变量按FAS_cat分组的范围 aggregate(somatic ~ FAS_cat, data = final_overall, FUN = range)
如果某个分组的范围完全在你设定的Y轴之外,那它的loess线自然不会显示在图中——这种情况下你需要调整Y轴范围,或者确认数据是否正确。
3. 备选方案:用scale_y_continuous保留所有数据
如果你一定要用scale_y_continuous,可以加上oob = scales::oob_keep参数,这样不会删除超出范围的数据,只是把它们放在轴外:
scale_y_continuous(limits = c(1.75, 2.75), oob = scales::oob_keep)
不过这种方法不如coord_cartesian直观,优先推荐前者。
内容的提问来源于stack exchange,提问作者Hilde Brons
相关产品推荐
相关产品推荐

