7
votes

Comment puis-je passer une esthétique GGPLot2 d'une variable?

J'ai du mal à passer un POSIXCT stocké dans une variable comme xmin / xmax pour geom_rect. J'ai essayé de construire un exemple autonome sans banaliser ce que j'essaie de faire ...

L'idée est de prendre un objet de tracé GGPLot2, dont X est un posixt et "zoomer" sur un particulier Plage dans le temps. Le zoom est dans le top 80% et la série complète est dans les 20% inférieure avec un indicateur de quelle partie est Zoom'd sur le dessus. P>

Mon problème est que je ne peux pas sembler avoir Le xmin / xmax est passé dans geom_rect - chaque chose que j'ai essayée (autre que d'assembler la parcelle à la main au lieu de la fonction) me donne une erreur différente. J'ai essayé d'utiliser des AES (), Aes_string (), passant comme paramètres au lieu de l'esthétique, qui passe juste des cordes, etc. p>

L'exemple ci-dessous me dit: P>

library(ggplot2)

subplot <- function(x, y) viewport(layout.pos.col=x, layout.pos.row=y)
vplayout <- function(x, y) {
  grid.newpage()
  pushViewport(viewport(layout=grid.layout(y,x)))
}

anm_zoom <- function(limits, p) {

  lims <- as.POSIXct(limits)
  limlab <- paste(lims, collapse=" to ")

  top <- p + scale_x_datetime(limlab, limits=lims, expand=c(0,0))

  bottom <- p;
  bottom <- bottom + opts(title="")
  bottom <- bottom + opts(legend.position="none")
  bottom <- bottom + opts(axis.title.y=theme_blank())
  bottom <- bottom + scale_x_datetime("", expand=c(0,0))
  bottom <- bottom + geom_rect(aes(xmin=lims[1], xmax=lims[2]),
 ymin=-Inf, ymax=Inf, fill="grey80", alpha=0.01)

  ## Render the plots
  vplayout(1,5)
  print(top, vp=subplot(1,c(1,2,3,4)))
  print(bottom, vp=subplot(1,5))
}


pdate <- seq.POSIXt(from=as.POSIXct("2010-09-09 00:00"),
   to=as.POSIXct("2010-09-10 23:59"), by="2 mins")
var1 <- rnorm(length(pdate))
var2 <- rnorm(length(pdate))
df1 <- data.frame(pdate, var1, var2)

dm  <- melt(df1, id="pdate")

p <- ggplot(dm) + aes(x=pdate, y=value) + stat_summary(fun.y="sum", geom="line")

anm_zoom(c("2010-09-09 12:15", "2010-09-09 12:30"), p)


0 commentaires

3 Réponses :


0
votes

Il vous suffit de changer le nom de vos limites de l'argumentation de la fonction, car je pense qu'il crée un conflit de scoper. Je viens de le changer en limites1 et aussi la première ligne de votre code pour lire LIMS = AS.posixcct (limites1) et cela fonctionne parfaitement. Vérifiez-le !!


1 commentaires

Pouvez-vous publier votre code de travail? J'ai fait les changements que vous avez suggéré et je n'ai vu aucune différence du tout. Les valeurs stockées dans LIMS [1: 2] semblent raisonnables lorsqu'elles sont imprimées à l'intérieur de la fonction, et c'est ce que j'essaie de passer à geom_rect. J'apprécie la suggestion, cependant!



8
votes

hmmmm, je pense que vous avez besoin d'une nouvelle fonction un peu comme aes (en ce qu'elle n'essaie pas d'analyser ses arguments) et un peu comme aes_string (en ce sens qu'elle évalue ses arguments immédiatement dans l'environnement local): xxx

puis xxx

donne vous ce que vous voulez.


1 commentaires

Oui, ça fait exactement ce que je voulais dire. J'adore toujours une réponse simple, même si je suis un peu gêné que c'est presque un noop ... :) Merci!



1
votes

Réécrite: de Réponse d'Hadley Suite

En raison des mises à jour de la version plus récente GGPLOT2 par Hadley , Une manière plus intuitive qui traite avec une évaluation non STD de ggplot () dans la fonction utilise AES_Q () comme suit: xxx


1 commentaires

Il semble AES _ fournirait la réponse aussi. L'aide mentionne que " AES_Q est un alias à < Code> AES _ ".