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

如何在RStudio中为逐日时间序列绘制分年月的箱线图?

嗨,我明白你的问题啦——你本来想每个月份下展示对应9个年份的箱线图,但现在只得到了12个(每个月份一个),这是因为你的代码里没有把年份作为分组变量,导致每个月份的所有年份数据被合并成了一个箱线~

下面我来帮你修正代码,同时提供两种展示方式供你选择:


第一步:先处理数据,提取年份信息

首先我们需要从日期列里拆分出年份,同时保留你已经设置好的有序月份因子:

library(ggplot2)

# 定义月份顺序(你原来的代码已经写好啦)
monthorder <- c('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')

# 从Date列提取年份,同时把月份转为有序因子
my_data$Year <- format(my_data$Date, "%Y")
my_data$Month <- factor(format(my_data$Date, "%b"), levels = monthorder)

方案一:同一月份下各年份箱线并排显示

这种方式会在x轴的每个月份刻度下,并排展示该月份所有年份的箱线,整体是一个连续的图,能直观对比同月份不同年份的径流差异:

ggplot(my_data, aes(x = Month, y = SURQ, group = interaction(Month, Year), fill = Year)) +
  # 用interaction指定每个「月份-年份」组合为独立分组,position_dodge让箱线并排
  geom_boxplot(position = position_dodge(width = 0.8)) +
  # 给箱线加上误差线,位置和箱线对齐
  geom_errorbar(aes(ymin = ..lower.., ymax = ..upper..),
                position = position_dodge(width = 0.8), width = 0.2) +
  # 添加标题和标签
  labs(title = "Daily Surface Runoff: Monthly Distribution by Year (1997-2005)",
       x = "Month", y = "Surface Runoff (mm)", fill = "Year") +
  theme_minimal()

方案二:按月份分面,每个面板展示对应年份的箱线

这种方式更清晰,每个月份单独一个面板,里面展示该月份9个年份的箱线,适合聚焦单个月份的年份间对比:

ggplot(my_data, aes(x = Year, y = SURQ)) +
  geom_boxplot(fill = "#2c3e50") +
  # 给箱线添加误差线
  geom_errorbar(aes(ymin = ..lower.., ymax = ..upper..), width = 0.2) +
  # 按月份分面,ncol控制每行显示3个面板
  facet_wrap(~Month, ncol = 3, scales = "fixed") +
  # 添加标题和标签,旋转年份标签避免重叠
  labs(title = "Daily Surface Runoff: Monthly Distribution by Year (1997-2005)",
       x = "Year", y = "Surface Runoff (mm)") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

为什么原来的代码只生成12个箱线?

你之前的代码ggplot(my_data, aes(Month, SURQ))只指定了x轴是月份,没有告诉ggplot要按年份分组,所以它会把每个月份下所有年份的数据合并计算箱线统计量,自然就只生成12个箱线啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:23:02