ggplot2绘制箱线图:保留真实日期刻度同时按变量填充
解决方法
核心是调整group分组映射规则:箱线图的分组需要同时覆盖x轴的时间维度和填充色对应的变量维度,将group设置为日期和变量的交互项即可同时满足两个需求,不需要把日期转成因子。
完整可运行代码如下:
library(ggplot2) # 构造示例数据 df <- data.frame( date = as.Date(c(rep('2021-01-01',6), rep('2021-05-04',6), rep('2015-04-04',6))), variable = rep(c('apple','bananna','carrot'),6), value = rnorm(18,5,2) ) # 绘图 ggplot(df, aes( x = date, y = value, fill = variable, group = interaction(date, variable) # 核心分组设置 )) + geom_boxplot() + # 可选:自定义x轴日期刻度格式,按需调整间隔和显示样式 scale_x_date(date_breaks = "2 years", date_labels = "%Y-%m-%d")
原代码问题说明
- 用
as.factor(date)作为x轴映射的写法:因子属于离散分类尺度,x轴会给每个日期分配等宽的刻度位置,完全忽略日期本身的时间差,比如间隔6年的2015-04-04和2021-01-01,会和间隔仅4个月的2021-01-01、2021-05-04显示为等距,不符合真实时间尺度要求。 - 仅设置
group=date的写法:ggplot会将同一日期下所有变量的观测值合并为一组,每个日期只会生成1个箱线,无法按变量拆分,自然无法实现按变量区分填充色的效果。
实现效果
运行代码后x轴会保留日期的连续时间尺度,三个日期的刻度位置严格匹配真实时间间隔;每个日期下会生成3个独立箱线,分别对应三个变量,填充色自动和variable变量的取值一一对应。
内容的提问来源于stack exchange,提问作者Squan Schmaan
相关产品推荐
相关产品推荐

