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

