/ / boxplot di ggplot2 per settimana - r, ggplot2

ggplot2 boxplots per settimana - r, ggplot2

Questo codice produce un singolo boxplot:

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("%Wn%b"))

inserisci la descrizione dell'immagine qui

Come posso produrre una trama con box singoli per ogni settimana tra il 1 dicembre e il 31 gennaio? Quindi all'interno della trama singola, dovrebbero esserci circa 8 schemi. Preferirei una soluzione che usi entrambi ggplot() o scale_x_date().

risposte:

2 per risposta № 1

Un'opzione è trasformare la tua data prima dell'uso 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()

2 per risposta № 2
library(ggplot2)
ggplot(df, aes(format(as.Date(my.date), "%Wn%b"), value)) + geom_boxplot()

Modificare:

Per ordinare le date:

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

0 per risposta № 3

Questo soddisfa la richiesta di @luciano di mantenere la funzionalità di 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 con scale_x_date

In alternativa, se non vuoi che i dati siano raggruppatiper settimana # - che ti dà la divisione intorno alla maggior parte dei nuovi anni - puoi raggruppare per settimana finendo la domenica come sotto. La regolazione dal week-end della domenica, per dire il venerdì, può essere ottenuta con un tale codice 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")

Raggruppa le domeniche settimanali