R: tracer une série temporelle avec des quantiles en utilisant ggplot2
je dois tracer une série chronologique avec ggplot2. Pour chaque point de la série temporelle, j'ai aussi quelques quantiles, disons 0.05, 0.25, 0.75, 0.95, c'est-à-dire que j'ai cinq données pour chaque point. Par exemple:
time quantile=0.05 quantile=0.25 quantile=0.5 quantile=0.75 quantile=0.95
00:01 623.0725 630.4353 903.8870 959.1407 1327.721
00:02 623.0944 631.3707 911.9967 1337.4564 1518.539
00:03 623.0725 630.4353 903.8870 1170.8316 1431.893
00:04 623.0725 630.4353 903.8870 1336.3212 1431.893
00:05 623.0835 631.3557 905.4220 1079.6623 1452.260
00:06 623.0835 631.3557 905.4220 1079.6623 1452.260
00:07 623.0835 631.3557 905.4220 1079.6623 1452.260
00:08 623.0780 631.3483 905.3496 1056.3719 1375.610
00:09 623.0671 630.4275 903.8839 1170.8196 1356.963
00:10 623.0507 630.0261 741.8475 1006.1208 1462.271
idéalement, je voudrais avoir la quantile 0.5 comme ligne noire et les autres comme intervalles de couleur ombrée entourant la ligne noire. Quelle est la meilleure façon de le faire? J'ai cherché partout sans succès, Je ne peux pas trouver d'exemples de cela, encore moins avec ggplot2.
Toute aide serait appréciée.
Salud!
2 réponses
Est-ce faire ce que vous voulez? Le truc ggplot
c'est de comprendre qu'il s'attend à des données en format long. Cela signifie souvent que nous devons transformer les données avant qu'elles ne soient prêtes à tracer, généralement avec melt()
.
après avoir lu vos données avec textConnection()
et la création d'un objet nommé dat
, voici les étapes qui vous auriez à prendre:
#Melt into long format
dat.m <- melt(dat, id.vars = "time")
#Not necessary, but if you want different line types depending on quantile, here's how I'd do it
dat.m <- within(dat.m
, lty <- ifelse(variable == "quantile.0.5", 1
, ifelse(variable %in% c("quantile.0.25", "quantile.0.75"),2,3)
)
)
#plot it
ggplot(dat.m, aes(time, value, group = variable, colour = variable, linetype = lty)) +
geom_line() +
scale_colour_manual(name = "", values = c("red", "blue", "black", "blue", "red"))
vous Donne:
après avoir relu votre question, vous voulez peut-être Rubans grisés en dehors de l'estimation médiane au lieu de lignes? Si oui, donnez ce un tourbillon. Le seul vrai truc ici, c'est que nous passons group = 1
comme esthétique pour que geom_line()
se comportera correctement avec les données de facteur / caractère. Auparavant, nous avons regroupé par les variables qui ont le même effet. Notez aussi que nous n'utilisons plus le melt
ed de données.cadre, comme les données de l'ensemble.le cadre nous conviendra parfaitement dans ce cas.
ggplot(dat, aes(x = time, group = 1)) +
geom_ribbon(aes(ymin = quantile.0.05, ymax = quantile.0.95, fill = "05%-95%"), alpha = .25) +
geom_ribbon(aes(ymin = quantile.0.25, ymax = quantile.0.75, fill = "25%-75%"), alpha = .25) +
geom_line(aes(y = quantile.0.5)) +
scale_fill_manual(name = "", values = c("25%-75%" = "red", "05%-95%" = "blue"))
Modifier: Pour forcer une légende pour la valeur prédite
nous pouvons utiliser la même approche que nous avons utilisée pour le geom_ribbon()
couches. Nous allons ajouter une esthétique geom_line()
et ensuite définir les valeurs de cette esthétique avec scale_colour_manual()
:
ggplot(dat, aes(x = time, group = 1)) +
geom_ribbon(aes(ymin = quantile.0.05, ymax = quantile.0.95, fill = "05%-95%"), alpha = .25) +
geom_ribbon(aes(ymin = quantile.0.25, ymax = quantile.0.75, fill = "25%-75%"), alpha = .25) +
geom_line(aes(y = quantile.0.5, colour = "Predicted")) +
scale_fill_manual(name = "", values = c("25%-75%" = "red", "05%-95%" = "blue")) +
scale_colour_manual(name = "", values = c("Predicted" = "black"))
il peut y avoir des façons plus efficaces de le faire, mais c'est la façon dont j'ai toujours utilisé et j'ai eu assez de succès avec elle. YMMV.
en supposant votre dat.le cadre est appelé df
:
le plus facile ggplot
LA solution est d'utiliser le géom boxplot. Cela donne une ligne centrale noire avec des boîtes remplies aux positions moyennes et supérieures.
puisque vous avez pré-résumé vos données, il est important de spécifier le stat="identity"
paramètre:
ggplot(df, aes(x=time)) +
geom_boxplot(
aes(
lower=quantile.0.25,
upper=quantile.0.75,
middle=quantile.0.5,
ymin=quantile.0.05,
ymax=quantile.0.95
),
stat="identity",
fill = "cyan"
)
PS. J'ai recréé vos données comme suit:
df <- "time quantile=0.05 quantile=0.25 quantile=0.5 quantile=0.75 quantile=0.95
00:01 623.0725 630.4353 903.8870 959.1407 1327.721
00:02 623.0944 631.3707 911.9967 1337.4564 1518.539
00:03 623.0725 630.4353 903.8870 1170.8316 1431.893
00:04 623.0725 630.4353 903.8870 1336.3212 1431.893
00:05 623.0835 631.3557 905.4220 1079.6623 1452.260
00:06 623.0835 631.3557 905.4220 1079.6623 1452.260
00:07 623.0835 631.3557 905.4220 1079.6623 1452.260
00:08 623.0780 631.3483 905.3496 1056.3719 1375.610
00:09 623.0671 630.4275 903.8839 1170.8196 1356.963
00:10 623.0507 630.0261 741.8475 1006.1208 1462.271"
df <- read.table(textConnection(df), header=TRUE)