如何在ggplot中移除填充日期且不截断箱线图?
解决ggplot日期箱线图的空白轴/首尾截断问题
当用ggplot绘制日期分组的箱线图时,常会遇到两个矛盾的问题:要么x轴自动在首尾日期外添加空白区间,要么用expand=0+limits强制限制范围时,首尾箱线会被截断。以下是几个可行的解决办法:
方法1:微调expand参数(最简单)
不用把expand设为完全expansion(0),而是给一个极小的扩展值,既可以消除大部分空白,又能给首尾箱线留出显示空间:
ggplot(df, aes(x=date, y = y, group = date)) + geom_boxplot() + scale_x_date( date_labels = "%a\n%m/%d", date_breaks = "1 day", labels = scales::labels_wrap(), expand = expansion(mult = 0.01) # 极小的扩展比例 )
方法2:用coord_cartesian控制显示范围
coord_cartesian是在已有的绘图数据上做视野裁剪,不会修改数据范围,因此不会截断箱线。配合scale_x_date的expand=0使用:
ggplot(df, aes(x=date, y = y, group = date)) + geom_boxplot() + scale_x_date( date_labels = "%a\n%m/%d", date_breaks = "1 day", labels = scales::labels_wrap(), expand = expansion(0) ) + coord_cartesian(xlim = c( min(df$date) - lubridate::days(0.5), # 向左扩展半天 max(df$date) + lubridate::days(0.5) # 向右扩展半天 ))
这里给首尾各留出半天的空间,刚好能完整显示箱线,同时x轴不会有多余的空白日期。
方法3:将日期转为有序因子(离散轴)
如果不需要日期轴的连续特性(比如不需要插值、计算时间差等),可以把日期转为有序因子,这样x轴会严格按照数据中的日期排列,没有空白,且所有箱线都完整显示:
df <- df %>% mutate(date_fct = fct_inorder(as.factor(date))) ggplot(df, aes(x=date_fct, y = y)) + geom_boxplot() + scale_x_discrete( labels = function(x) strftime(as.Date(x), "%a\n%m/%d") ) + labs(x = "date")
以上三种方法都能解决你的问题,可根据实际需求选择:如果需要保留连续日期轴的特性,优先选方法1或2;如果只需要展示现有日期的箱线,方法3更直接。
内容的提问来源于stack exchange,提问作者seansteele
相关产品推荐
相关产品推荐

