如何在R的ggplot中跳过X轴上的每隔一个日期标签
解决方案:自定义ggplot日期X轴标签(保留奇数位月度标签)
问题描述
现有如下ggplot测试代码绘制日期图表:
start_date <- as.Date('2020-08-08') end_date <- as.Date('2021-05-10') # 构造测试数据 df <- tibble( dates = as.Date(as.character(seq(start_date, end_date, by = 4) ) ), yval = as.numeric(strftime(dates, format = "%d")), month = strftime(dates, format = "%m") ) %>% group_by( month ) ggplot(df, aes( x=dates, y=yval, color = month ) ) + geom_point() + scale_x_date(date_labels = "%b %d", breaks = "1 month")
当前X轴会显示所有月度日期标签,需求是移除第2、4、6…(偶数位)的标签。尝试设置breaks = "2 month"会移除第1、3、5…(奇数位)的标签,需要一种无需手动指定标签的解决办法。
解决方法
可以通过自定义breaks生成逻辑来实现:先自动生成所有月度的breaks,再筛选保留奇数位置的标签。具体代码修改如下:
ggplot(df, aes( x=dates, y=yval, color = month ) ) + geom_point() + scale_x_date( date_labels = "%b %d", breaks = function(x) { # 生成所有月度breaks all_breaks <- seq.Date(floor_date(min(x), "month"), ceiling_date(max(x), "month"), by = "1 month") # 筛选保留奇数位置的元素(第1、3、5...个) all_breaks[seq(1, length(all_breaks), 2)] } )
代码说明
floor_date(min(x), "month"):将数据中最早的日期向下取整到当月第一天ceiling_date(max(x), "month"):将数据中最晚的日期向上取整到当月第一天seq.Date(...):生成从上述两个日期开始的所有月度起始日作为候选breaksall_breaks[seq(1, length(all_breaks), 2)]:提取奇数索引的breaks,即保留第1、3、5…个月度标签
这样就能自动保留奇数位的月度标签,不用手动逐个指定日期,适配不同的时间范围数据。
内容的提问来源于stack exchange,提问作者Mathica
相关产品推荐
相关产品推荐

