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
相关产品推荐
相关产品推荐

