ggplot2 boxplots by week

后端 未结 3 588
轮回少年
轮回少年 2020-12-18 10:44

This code produces a single boxplot:

df <- data.frame(value = rnorm(62), my.date = seq(as.Date(\"2013-12-01\"), as.Date(\"2014-01-31\"), by=\"1 day\"))

l         


        
相关标签:
3条回答
  • 2020-12-18 11:16

    This fulfils @luciano's request to retain functionality of scale_x_date

    library('scales')
    library(ggplot2)
    df <- data.frame(value = rnorm(62), my.date = seq(as.Date("2013-12-01"), as.Date("2014-01-31"), by="1 day"))
    ggplot(df, aes(x=as.Date(my.date), y=value, group=format(as.Date(my.date),"%W-%b"))) + geom_boxplot() + scale_x_date(date_breaks = "1 week", date_labels="%Y-%b-%d")
    

    Alternatively, if you don't want the data grouped by week# - which gives you the split around most new years - you can group by week ending Sundays as below. Adjusting from the Sunday weekending, to say Friday, can be achieved with some such code ceiling_date(x, "week") + ifelse(weekdays(x) %in% c("Saturday", "Sunday"), 5, -2)

    ggplot(df, aes(x=as.Date(my.date), y=value, group=ceiling_date(my.date, "week"))) + geom_boxplot() + scale_x_date(date_breaks = "1 week", date_labels="%Y-%b-%d")
    

    0 讨论(0)
  • 2020-12-18 11:23

    One option is to transform your date before using ggplot

    library(ggplot2)
    df <- data.frame(value = rnorm(62), 
    my.date = seq(as.Date("2013-12-01"), as.Date("2014-01-31"), by="1 day"))
    weeks <- format(df$my.date, "%Y/%W")
    weeks <- factor(weeks, levels = unique(weeks))
    
    ggplot(df, aes(weeks, value)) +
        geom_boxplot()
    
    0 讨论(0)
  • 2020-12-18 11:34
    library(ggplot2)    
    ggplot(df, aes(format(as.Date(my.date), "%W\n%b"), value)) + geom_boxplot()  
    

    Edit:

    To order the dates:

    ggplot(df, aes(reorder(format(as.Date(my.date), "%W\n%b"), 
                           as.Date(my.date)), 
                   value)) + 
      geom_boxplot() 
    
    0 讨论(0)
提交回复
热议问题