geom_boxplot绘制箱线图时自定义垂直竖线不显示问题求助
问题原因
你遇到的竖线不显示问题有两个核心原因:
- 你的X轴是通过
reorder(format(dat$date,'%b %y'),dat$date)生成的离散分类变量,X轴的坐标本质是从1开始的整数(每一个整数对应一个年月分组),不是连续的日期数值。你传入as.numeric(as.Date("2013-08-23"))得到的是日期对应的时间戳数值,远远超出X轴的坐标范围,自然无法显示。 - 你提供的示例数据日期全部为2020年12月,2013-08-23对应的年月不在数据覆盖范围内,即便X轴是连续日期类型,竖线也会落在绘图区域外无法显示,需要确认你的实际数据集是否包含2013年8月对应的年月分组。
解决方案
方案1:保留离散年月X轴
先自动计算2013年8月对应的分组位置,再传入geom_vline即可,代码如下:
library(ggplot2) # 生成排序后的所有年月标签 month_labels <- unique(format(dat$date,'%b %y'))[order(unique(dat$date))] # 匹配2013年8月对应的分组位置,没有匹配结果则说明数据不含该时间段 vline_pos <- which(month_labels == format(as.Date("2013-08-23"), "%b %y")) ggplot(dat) + geom_boxplot(aes(y = daily_count, # aes内不需要加dat$前缀,ggplot会自动从数据集取列 x = reorder(format(date,'%b %y'), date), fill = category)) + xlab('Month & Year') + ylab('Count') + guides(fill = guide_legend(title = "Category")) + theme_bw() + theme(axis.text = element_text(size = 10), axis.title = element_text(size = 10)) + geom_vline(xintercept = vline_pos, linetype = 1, colour = "red")
方案2:改用连续日期X轴
如果需要更灵活的日期操作,可以把X轴设为连续日期类型,直接传入目标日期即可,还可以手动扩展X轴范围包含2013年的时间段:
library(ggplot2) ggplot(dat) + geom_boxplot(aes(y = daily_count, x = date, group = cut(date, "month"), fill = category)) + # 设置X轴标签为年月格式,同时扩展范围包含2013年 scale_x_date(date_labels = "%b %y", name = "Month & Year", limits = c(as.Date("2013-01-01"), max(dat$date))) + ylab('Count') + guides(fill = guide_legend(title = "Category")) + theme_bw() + theme(axis.text = element_text(size = 10), axis.title = element_text(size = 10)) + # 直接传入日期即可 geom_vline(xintercept = as.Date("2013-08-23"), linetype = 1, colour = "red")
内容的提问来源于stack exchange,提问作者AneesBaqir
相关产品推荐
相关产品推荐

