如何在R语言散点图中添加对应所选日期星期的均值与标准差水平线
R代码实现方案
我们先预计算所有目标星期的均值、标准差,再修改散点绘图函数自动匹配对应日期的星期数值,添加水平线即可,完整可运行代码如下:
# 加载所需包 library(dplyr) library(ggplot2) library(tidyr) library(lubridate) library(readxl) # 1. 读入原始数据 df <- read_excel('C:/Users/Downloads/database_test.xlsx') # 2. 预计算各目标星期的均值、标准差(复用原有统计逻辑) df_clean <- df %>% filter(date2 < date1) %>% # 保留date2小于date1的记录 mutate(across(starts_with("date"), as.Date)) %>% group_by(date2) %>% summarise( Id = first(Id), date1 = first(date1), Week = first(Week), D = first(D), D1 = sum(D1) ) %>% ungroup() %>% filter(is.na(D)) # 保留D为空的记录 # 按星期分组计算统计值 week_stats <- df_clean %>% group_by(Week) %>% summarise( mean_week = mean(as.numeric(D1), na.rm = T), sd_week = sd(as.numeric(D1), na.rm = T), mean_plus_sd = mean_week + sd_week ) # 3. 修改后的散点绘图函数 scatter_date <- function(dt, dta = df, stats = week_stats) { # 转换输入日期格式,匹配对应星期的统计值 target_date <- ymd(dt) target_week <- df_clean$Week[df_clean$date2 == target_date] target_stats <- stats[stats$Week == target_week, ] # 原有散点数据处理逻辑 plot_data <- dta %>% filter(date2 == target_date) %>% summarize(across(starts_with("DR"), sum)) %>% pivot_longer(everything(), names_pattern = "DR(.+)", values_to = "val") %>% mutate(name = as.numeric(name)) # 绘制散点图,调整y轴范围避免水平线超出显示 plot(plot_data$name, plot_data$val, xlab = "Days", ylab = "Types", xlim = c(0, 7), ylim = c(0, max(plot_data$val, target_stats$mean_plus_sd) + 2)) # 添加两条水平线,可自行调整颜色、线型 abline(h = target_stats$mean_week, col = "red", lwd = 2, lty = 2) # 均值线:红色虚线 abline(h = target_stats$mean_plus_sd, col = "blue", lwd = 2, lty = 2) # 均值+标准差线:蓝色虚线 # 可选添加图例 legend("topright", legend = c(paste0(target_week, "均值:", round(target_stats$mean_week, 2)), paste0(target_week, "均值+标准差:", round(target_stats$mean_plus_sd, 2))), col = c("red", "blue"), lty = 2, lwd = 2) } # 测试调用 scatter_date("2021-04-10")
修改说明
- 提前预计算了所有符合条件的星期对应的统计值,不用每次调用绘图函数重复计算,运行效率更高
- 绘图函数新增了日期自动匹配星期的逻辑,传入指定日期后会自动拉取对应的均值、标准差,不需要手动指定星期参数
- 你可以根据自身需求调整水平线的颜色、线型、是否显示图例等样式参数
内容的提问来源于stack exchange,提问作者Antonio
相关产品推荐
相关产品推荐

