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!

8
demandé sur alain.janinm 2011-06-14 11:39:20

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:

enter image description here

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 melted 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")) 

enter image description here

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.

9
répondu Chase 2011-06-14 18:20:13

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"
)

enter image description here

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)
5
répondu Andrie 2011-06-14 11:11:43