按月在ggplot中订购日期

时间:2016-02-22 16:42:31

标签: r date

我在as.Date格式“yyyy-mm-dd”中有DF$Date,如下所示。是否有一种简单的方法可以在ggplot中按月分组?

Date
2015-07-30
2015-08-01
2015-08-02
2015-08-06
2015-08-11
2015-08-12

我添加了一列DF$Month作为“年月名”(例如2015年4月)。 我是在DF$Month<-strftime(DF$Date,format="%B %Y")

这样做的

有没有快速的方法来计算月份/年份,以便它们是有序的? 我通过格式化使用了一种解决方法: DF$Month<-strftime(DF$Date,format="%Y-%m")以便更大的数字是第一个,然后是月份数。 这给出了可排序的输出:

DF$Month
"2015-07" 
"2015-08"

此输出允许我进行此分组: http://imgur.com/df1FI3s 使用此图时:

MonthlyActivity<-ggplot(DF,aes(x=Month, y=TotalSteps))+
  geom_boxplot()
MonthlyActivity

任何替代方案,以便我可以使用完整的月份名称并仍然按正确的时间顺序?

2 个答案:

答案 0 :(得分:2)

可能还有其他解决方案,但这里有一个月份名称作为因素。正如您已经发现的那样,您需要一个x变量来分组。然后,我们可以将其视为“订购因素”问题,而不是日期规模问题。

#first, generate some data
dat <- data.frame(date=sample(seq(as.Date("01012015",format="%d%m%Y"),
                           as.Date("01082015", format="%d%m%Y"),by=1),1000,T),
                  value=rnorm(1000))

我们找到最小和最大月份,并进行一些日期算术以允许所有开始日期(以便在最小日期为29/30 / 31时不会跳过2月)。我使用了lubridate。

library(lubridate)
min_month = min(dat$date)-day(min(dat$date))+1
max_month = max(dat$date)-day(max(dat$date))+1

我们生成一个分组变量。这是“2015年1月,2015年3月”等标签的一个因素。但是,我们通过从最小日期到最大日期创建一个序列(按月)来强制执行订单,并以相同的方式对其进行格式化。

dat$group <- factor(format(dat$date, "%B %Y"), 
                    levels=format(seq(min_month, max_month,by="month"),
                                                             "%B %Y"))

这会强制轴上的排序:

enter image description here

答案 1 :(得分:0)

尝试添加

scale_x_discrete(limits = month.abb)

所以您的代码应该是

MonthlyActivity<-ggplot(DF,aes(x=Month, y=TotalSteps))+ geom_boxplot()+scale_x_discrete(limits = month.abb)

您将需要library(dplyr)