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"))
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 № 1Un'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")
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")