我在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
任何替代方案,以便我可以使用完整的月份名称并仍然按正确的时间顺序?
答案 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"))
这会强制轴上的排序:
答案 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)