首页 > 解决方案 > 指定跨新年的日期轴的限制

问题描述

我正在使用这个数据集来绘制月度摘要。我在 ggplot2 中遇到的一个问题是让 x 轴从第 10 个月到第 12 个月,然后继续从第 1 个月到第 4 个月。在下面的示例中,我使用 20 年的数据集展示了这一点,其中我删除了从 5 月到 9 月的月份并绘制其余部分。

library(lubridate)
library(ggplot2)
mon=seq.Date(from=as.Date("2000-01-01"),to=as.Date("2019-12-01"),by="month")
val=rnorm(length(mon))
dd=data.frame(mon,val)
ddsub=subset(dd,month(mon)<5 |month(mon) >9)
ggplot(data=ddsub,aes(month(mon),val,group=month(mon))) + geom_boxplot() + 
      xlab("Month") + scale_x_continuous(breaks=c(1:12))

有差距的月度数据

我想要的是 x 轴从 10 月开始并持续到年底到 4 月。由于month(ddsub$mon)返回一个导致连续水平轴的数字,我还没有找到任何打破升序数字顺序的巧妙方法。

我唯一的解决方案是将月份定义为我然后以正确的方式重新排序的因素

mon_factor=as.factor(month(ddsub$mon))
ddsub$mon_ahead=reorder(mon_factor,rep(c(4,5,6,7,1,2,3),20))
ggplot(data=ddsub,aes(mon_ahead,val)) + geom_boxplot() + xlab("Month")

在此处输入图像描述

虽然这可行,但我认为它不是一个优雅的解决方案。必须定义一个新的月份变量然后重新排序是很麻烦的。

有谁知道是否有一种方法可以直接使用 Date-objects 并定义轴的限制,使其在 Oct 开始并在 Apr 结束?

标签: rdatetimeggplot2

解决方案


我认为在这里使用一个因子将是最简单的,您可以使用mo_FY如下所示的帮助列自动排序,这使得会计年度的 10 月份1成为月份。我喜欢forcats::fct_reorder建立排序的语法。

ddsub$mo_FY = (month(ddsub$mon) + 2) %% 12 + 1
ddsub$mon_fct = forcats::fct_reorder(factor(month(ddsub$mon)), ddsub$mo_FY)                 
ggplot(data=ddsub, aes(mon_fct, val)) + 
  geom_boxplot() + 
  xlab("Month") 

在此处输入图像描述


推荐阅读