ggplot2 boxplots по неделям

Этот код создает один боксплот:

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

library(ggplot2)
ggplot(df, aes(as.Date(my.date), value)) + geom_boxplot() + scale_x_date(minor_breaks = "1 week", labels = date_format("%W\n%b"))

Как я могу создать сюжет, в котором есть отдельные боксы для каждой недели с 1 декабря по 31 января? Таким образом, в пределах одного сюжета должно быть около 8 коробочных участков. Предпочел бы решение, которое использует либо ggplot() или же scale_x_date(),

3 ответа

Это выполняет запрос @luciano о сохранении функциональности 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")

Boxplot используя scale_x_date

В качестве альтернативы, если вы не хотите, чтобы данные группировались по неделе # - что дает вам разбивку по большинству новых лет - вы можете группировать по воскресеньям, заканчивающимся на неделю, как показано ниже. Приспособление от воскресных выходных, скажем, пятницы, может быть достигнуто с некоторым таким кодом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")

Группа по выходным воскресеньям

library(ggplot2)    
ggplot(df, aes(format(as.Date(my.date), "%W\n%b"), value)) + geom_boxplot()  

Редактировать:

Чтобы заказать даты:

ggplot(df, aes(reorder(format(as.Date(my.date), "%W\n%b"), 
                       as.Date(my.date)), 
               value)) + 
  geom_boxplot() 

Одним из вариантов является преобразование вашей даты перед использованием 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()
Другие вопросы по тегам