基于连续日期数据绘制按年份分组的双填充箱线图求助
解决按年份/月份分组的箱线图问题
看起来核心问题出在分组逻辑上——你之前用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
相关产品推荐
相关产品推荐

