You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 12:57:33