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