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

如何在R绘制的图表中插入按星期计算的均值与均值加标准差水平虚线

修改后可直接运行的完整代码

library(dplyr)
library(tidyr)
library(ggplot2)
library(lubridate)

df <- structure(
  list(date = c("2021-08-01","2021-08-01","2021-08-01","2021-08-01","2021-08-01",
                "2021-08-08","2021-08-08","2021-08-08","2021-08-08","2021-08-08","2021-08-08",
                "2021-08-13","2021-08-13","2021-08-13","2021-08-13","2021-08-13"),
       Week= c("Sunday","Sunday","Sunday","Sunday","Sunday","Sunday","Sunday","Sunday",
               "Sunday","Sunday","Sunday","Friday","Friday","Friday","Friday","Friday"),
       D1 = c(0,1,0,0,5,0,1,0,0,9,4,3,4,5,6,7), DR01 = c(2,1,0,0,3,0,1,0,1,7,2,3,4,6,7,8), 
       DR02 = c(2,0,0,0,4,2,1,0,1,4,2,3,4,5,6,7),  DR03 = c(2,0,0,2,6,2,0,0,1,5,2,2,4,5,7,5),
       DR04 = c(2,0,0,5,6,2,0,0,3,7,2,3,4,5,6,4),  DR05 = c(2,0,0,5,6,2,0,0,7,7,2,3,4,5,6,7), 
       DR06 = c(2,0,0,5,7,2,0,0,7,7,1,3,5,6,7,8),  DR07 = c(2,0,0,6,9,2,0,0,7,8,1,3,5,6,4,3)), 
  class = "data.frame", row.names = c(NA, -16L))


scatter_date <- function(dt, dta = df) {
  # 计算目标日期对应星期的D1总和统计量
  target_week <- as.character(wday(ymd(dt), label = TRUE, abbr = FALSE))
  week_stats <- dta %>%
    mutate(date = ymd(date)) %>%
    filter(Week == target_week) %>%
    group_by(date) %>%
    summarise(d1_total = sum(D1), .groups = "drop") %>%
    summarise(
      mean_val = mean(d1_total),
      sd_val = sd(d1_total)
    )
  
  # 原有绘图逻辑
  plot_data <- dta %>%
    mutate(date = ymd(date)) %>%
    filter(date == ymd(dt)) %>%
    summarize(across(starts_with("DR"), sum)) %>%
    pivot_longer(everything(), names_pattern = "DR(.+)", values_to = "val") %>%
    mutate(name = as.numeric(name))
  
  plot(plot_data$name, plot_data$val, xlab = "Days", ylab = "Types", xlim = c(0, 7))
  
  # 插入两条水平虚线
  abline(h = week_stats$mean_val, lty = 2, col = "red")
  abline(h = week_stats$mean_val + week_stats$sd_val, lty = 2, col = "blue")
  
  # 可选:添加图例说明
  legend("topright", 
         legend = c(paste0("均值: ", round(week_stats$mean_val,2)), 
                    paste0("均值+标准差: ", round(week_stats$mean_val + week_stats$sd_val,2))),
         lty = 2, col = c("red", "blue"), bty = "n")
}
scatter_date("2021-08-01")

说明

  • 代码完全匹配要求的计算规则:自动匹配输入日期对应的星期几,拉取所有同星期日期的D1列总和计算均值和标准差
  • 调用scatter_date("2021-08-01")时,会自动计算得到周日的均值为10、标准差为5.66,和给定的计算结果一致
  • 可自行修改col参数调整虚线颜色,lty参数调整线型,不需要图例可以直接删除对应代码段

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 03:18:01