Order dates in ggplot by month

霸气de小男生 提交于 2020-04-30 07:49:37

问题


I have DF$Date in the as.Date format "yyyy-mm-dd" as shown below. Is there an easy way to get these grouped by month in ggplot?

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

I've added a column DF$Month as "year Monthname" (e.g. April 2015.) I'm doing this by DF$Month<-strftime(DF$Date,format="%B %Y")

Is there a quick way to factor the month/years so that they are ordinal? I used a workaround by formatting using: DF$Month<-strftime(DF$Date,format="%Y-%m") so that the larger numbers are first and subsequently the month number. This gives the output, which is sortable:

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

This output allows me to get this grouping: http://imgur.com/df1FI3s When using this plot:

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

Any alternatives so I can use the full month name and still be in the correct time order?


回答1:


There are probably other solutions, but here is one with full month names as a factor. As you already found out, you need a x variable to group by. We can then treat it as a 'order a factor' problem instead of a date-scale problem.

#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))

We find the minimum and maximum month, and do some date-arithmetic to allow for all start-days (so that february doesn't get skipped when the minimum date is on the 29th/30th/31st). I used lubridate for this.

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

We generate a grouping variable. It is a factor with labels like 'January 2015, March 2015'. However, we force the order by creating a sequence (by month) from min date to max date and formatting it in the same way.

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

This forces the ordering on the axis:




回答2:


Try adding

scale_x_discrete(limits = month.abb)

so your code would be

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

you will need library(dplyr)



来源:https://stackoverflow.com/questions/35559058/order-dates-in-ggplot-by-month

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!