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

R语言:逐步在同一图表中添加散点图及回归线

逐步添加系列的带回归线散点图实现

需求说明

需要基于数据框df逐步生成带回归线的散点图:

  • 第一张图:仅展示A与Date的散点及回归线
  • 第二张图:在第一张基础上添加B与Date的散点及回归线
  • 第三张图:继续添加C与Date的散点及回归线,依此类推

已知可将数据转为长格式后用ggplot2一次性绘制所有系列,但需要实现逐个系列逐步添加的效果。

数据示例

原始宽格式数据框df

Date        A      B      C      D      E
<POSIXct>   <int>  <int>  <int>  <int>  <int>
2019-10-3   2      1      0      4      6
2019-10-4   1      0      3      3      5
2019-10-5   0      1      1      2      3
2019-10-6   6      5      2      2      6
2019-10-7   3      5      4      1      4

转换后的长格式数据

Date        variable  value
<POSIXct>   <fctr>    <int>
2019-10-03  A         2     
2019-10-04  A         1     
2019-10-05  A         0     
2019-10-06  A         6     
2019-10-07  A         3     
2019-10-03  B         1     
2019-10-04  B         0     
2019-10-05  B         1     
2019-10-06  B         5     
2019-10-07  B         5  ...

现有一次性绘制代码(中文注释版)

# 初始化数据
df <- data.frame(
  Date = as.POSIXct(c("2019-10-3", "2019-10-4", "2019-10-5", "2019-10-6", "2019-10-7"), 
                    format = "%Y-%m-%d"),
  A = as.integer(c(2, 1, 0, 6, 3)),
  B = as.integer(c(1, 0, 1, 5, 5)),
  C = as.integer(c(0, 3, 1, 2, 4)),
  D = as.integer(c(4, 3, 2, 2, 1)),
  E = as.integer(c(6, 5, 3, 6, 4))
)

# 一次性绘制所有系列的管道代码
df %>% 
  reshape2::melt(id = "Date") %>%  # 转换为长格式
  ggplot(aes(x = Date, y = value, colour = variable)) + 
  geom_point() +  # 添加散点
  geom_smooth(method = lm, se = FALSE)  # 添加线性回归线(不显示置信区间)

逐步添加系列的实现方案

方法1:基于长格式数据循环添加图层

适合变量较多的场景,通过循环自动逐个添加系列:

# 加载所需包
library(ggplot2)
library(reshape2)
library(dplyr)

# 初始化数据(同上述代码)
df <- data.frame(
  Date = as.POSIXct(c("2019-10-3", "2019-10-4", "2019-10-5", "2019-10-6", "2019-10-7"), 
                    format = "%Y-%m-%d"),
  A = as.integer(c(2, 1, 0, 6, 3)),
  B = as.integer(c(1, 0, 1, 5, 5)),
  C = as.integer(c(0, 3, 1, 2, 4)),
  D = as.integer(c(4, 3, 2, 2, 1)),
  E = as.integer(c(6, 5, 3, 6, 4))
)

# 转换为长格式
df_long <- reshape2::melt(df, id = "Date")

# 获取所有变量名称
vars <- unique(df_long$variable)

# 初始化基础ggplot对象(仅设置坐标轴和主题)
p <- ggplot() +
  labs(x = "Date", y = "Value") +
  theme_minimal()

# 循环逐个添加变量的散点和回归线
for (var in vars) {
  # 提取当前变量的数据
  data_sub <- df_long %>% filter(variable == var)
  # 添加散点图层
  p <- p + geom_point(data = data_sub, aes(x = Date, y = value, color = variable))
  # 添加回归线图层
  p <- p + geom_smooth(data = data_sub, aes(x = Date, y = value, color = variable), 
                       method = lm, se = FALSE)
  # 打印当前步骤的图形(每次循环输出一张逐步添加后的图)
  print(p)
}

方法2:基于宽格式数据手动逐步添加

适合变量较少的场景,直观控制每一步添加的系列:

library(ggplot2)

# 初始化数据(同上述代码)
df <- data.frame(
  Date = as.POSIXct(c("2019-10-3", "2019-10-4", "2019-10-5", "2019-10-6", "2019-10-7"), 
                    format = "%Y-%m-%d"),
  A = as.integer(c(2, 1, 0, 6, 3)),
  B = as.integer(c(1, 0, 1, 5, 5)),
  C = as.integer(c(0, 3, 1, 2, 4)),
  D = as.integer(c(4, 3, 2, 2, 1)),
  E = as.integer(c(6, 5, 3, 6, 4))
)

# 初始化基础图层
p <- ggplot(df, aes(x = Date)) +
  labs(x = "Date", y = "Value") +
  theme_minimal()

# 第一步:添加A系列
p <- p + 
  geom_point(aes(y = A, color = "A")) +
  geom_smooth(aes(y = A, color = "A"), method = lm, se = FALSE)
print(p)  # 输出仅含A的图

# 第二步:添加B系列
p <- p + 
  geom_point(aes(y = B, color = "B")) +
  geom_smooth(aes(y = B, color = "B"), method = lm, se = FALSE)
print(p)  # 输出含A、B的图

# 第三步:添加C系列
p <- p + 
  geom_point(aes(y = C, color = "C")) +
  geom_smooth(aes(y = C, color = "C"), method = lm, se = FALSE)
print(p)  # 输出含A、B、C的图

# 后续D、E系列重复上述步骤即可...

说明

  • 两种方法都能实现逐步添加系列的效果,每次添加后执行print(p)即可得到对应步骤的图形
  • 方法1无需手动重复代码,适合变量较多的场景;方法2逻辑直观,适合变量较少的情况

内容的提问来源于stack exchange,提问作者AlgoManiac

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 04:45:07