如何在ggplot中结合数据集不同部分绘制带条件回归线的散点图
解决方案:在同一ggplot中显示全量散点+指定子集的回归线
没问题,咱们可以直接在同一个ggplot对象里组合两个图层,不需要分开绘制两次。核心是给geom_smooth()单独指定过滤后的数据集,这样既能保留所有散点,又只给符合条件的数据添加回归线。
完整代码示例
library(tidyverse) # 初始化数据集 df <- tibble( "FID" = c(1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2), "NDVI" = c(0.5, 0.55, 0.2, 0.3, 0.4, 0.5, 0.5, 0.5, 0.5, 0.55, 0.7, 0.72, 0.3, 0.35, 0.45, 0.50, 0.60, 0.65, 0.7, 0.7), "days" = c(-36, -60, 0, 30, 60, 90, 100, 120, 140, 200, -36, -60, 0, 30, 60, 90, 100, 120, 140, 200) ) # 组合图层绘制目标图形 df %>% ggplot(aes(x = days, y = NDVI)) + # 绘制所有数据的散点 geom_point(aes(color = as.factor(FID), fill = as.factor(FID)), alpha = 0.5, shape = 21, size = 5) + # 仅对days>0的数据添加线性回归线(带置信区间) geom_smooth( data = . %>% filter(days > 0), # 这里是关键:给该图层单独传过滤后的数据 aes(color = as.factor(FID)), method = "lm", se = TRUE ) + # 优化图例名称(可选但推荐) labs(color = "FID", fill = "FID")
关键细节说明
- 图层级数据过滤:通过
data = . %>% filter(days > 0),我们只给geom_smooth()图层传入days>0的子集,而整个ggplot的主数据源还是完整的df,所以散点会显示所有数据。 - 统一美学映射:保持
color和fill的映射一致,确保散点和回归线的图例统一,不会出现重复图例。 - 置信区间控制:
se=TRUE会显示回归线的95%置信区间,如果不需要可以改成se=FALSE。
这样就能完美实现你想要的效果:所有散点完整展示,仅days>0的部分按FID分别生成线性回归线~
内容的提问来源于stack exchange,提问作者Oriol Baena Crespo
相关产品推荐
相关产品推荐

