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

基于连续日期数据绘制按年份分组的双填充箱线图求助

解决按年份/月份分组的箱线图问题

看起来核心问题出在分组逻辑上——你之前用group=date会让ggplot按单个日期生成箱线图,而非按年份/月份聚合,这也是scale_x_date没生效的原因(x轴被密集的单日刻度挤占,年份刻度根本显示不出来)。咱们一步步调整,实现你想要的效果:

第一步:预处理数据,提取年份/月份分组字段

先从date列中拆分出年份、月份信息,推荐用lubridate包(语法更简洁),也可以用base R实现:

# 安装加载lubridate(若未安装)
# install.packages("lubridate")
library(lubridate)
library(ggplot2)

# 提取年份(数值/字符型都可)
sights$year <- year(sights$date)
# 提取"年-月"组合(避免不同年份同月份混淆)
sights$year_month <- format(sights$date, "%Y-%m")
# 提取月份名称(用于跨年份的月份对比)
sights$month_name <- month(sights$date, label = TRUE) # 显示Jan/Feb这类格式

第二步:按年份分组的箱线图

把分组变量换成year,就能实现每年一个箱线(每种type对应不同填充色):

方案1:用年份作为分类x轴(更直观)

p_year <- ggplot(sights, aes(x = factor(year), y = number, fill = type)) +
  geom_boxplot(alpha = 0.7) +
  labs(x = "年份", y = "Number", title = "按年份分组的箱线图") +
  scale_fill_manual(values = c("tot" = "#2E86AB", "gps" = "#F24C4C")) # 自定义两种填充色

p_year

方案2:保留日期格式x轴(显示年份刻度)

如果想保留日期轴的属性,只需把group设为year(date),再调整x轴刻度:

p_year_date <- ggplot(sights, aes(x = date, y = number, group = year(date), fill = type)) +
  geom_boxplot(alpha = 0.7) +
  scale_x_date(breaks = as.Date(paste0(2005:2018, "-01-01")), # 每年1月1日作为刻度点
               date_labels = "%Y") + # 仅显示年份文本
  labs(x = "年份", y = "Number", title = "按年份分组的箱线图(日期轴格式)") +
  scale_fill_manual(values = c("tot" = "#2E86AB", "gps" = "#F24C4C"))

p_year_date

第三步:按月份分组的箱线图

根据需求分两种场景实现:

场景1:按"年-月"单独分组(每个月一个箱线)

适合查看每个月的独立分布:

p_month_year <- ggplot(sights, aes(x = year_month, y = number, fill = type)) +
  geom_boxplot(alpha = 0.7) +
  labs(x = "年月", y = "Number", title = "按年月分组的箱线图") +
  scale_fill_manual(values = c("tot" = "#2E86AB", "gps" = "#F24C4C")) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) # 旋转x轴标签避免重叠

p_month_year

场景2:按月份名称聚合(跨年份合并同月份)

适合对比不同年份同一月份的分布差异:

p_month <- ggplot(sights, aes(x = month_name, y = number, fill = type)) +
  geom_boxplot(alpha = 0.7) +
  labs(x = "月份", y = "Number", title = "按月份分组的箱线图(跨年份合并)") +
  scale_fill_manual(values = c("tot" = "#2E86AB", "gps" = "#F24C4C"))

p_month

补充提示

  • 你可以完全自定义scale_fill_manual里的颜色值,换成你偏好的配色;
  • 如果你的年份范围和示例不同,调整scale_x_date中breaks的年份序列即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:00:56