Tengo problemas para pasar un POSIXct almacenado en una variable como xmin/xmax para geom_rect. Intenté construir un ejemplo independiente sin trivializar lo que estoy tratando de hacer ...¿Cómo puedo pasar una estética ggplot2 de una variable?
La idea es tomar un objeto de trazado ggplot2, cuya x es una POSIXt, y "acercar" en un rango particular en el tiempo. El zoom está en el 80% superior y toda la serie en el 20% inferior con un indicador de qué parte se acerca.
Mi problema es que me parece que no puede conseguir el xmin/xmax pasado a geom_rect - cada cosa que he probado (que no sea el montaje de la trama a mano en vez de la función) me da un error diferente. Tengo intentos usando un algoritmo AES(), aes_string(), pasando como parámetros en lugar de la estética, pasando sólo cuerdas, etc.
El siguiente ejemplo me dice:
Error in eval(expr, envir, enclos) : object 'lims' not found
Creo que mi problema es que el Las variables que estoy usando para establecer la estética no están en el alcance cuando se procesa la estética, pero no puedo entender cómo hacerlo. Ayuda.
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)
Sí, hace exactamente lo que quise decir. Siempre me gusta una respuesta simple, aunque estoy un poco avergonzado de que sea casi un NOOP ... :) ¡Gracias! –