2012-05-12 12 views
11

¿Qué estoy haciendo mal aquí, por favor? Estoy tratando de sombrear rectángulos alternos de 24 horas con gris transparente. Pero solo se dibuja el último rectángulo del for-loop (?!?) Si hago las cosas manualmente en lugar de for-loop, funciona bien.ggplot2: cómo sombrear transparentemente los días alternos en una parcela

¿Hay alguna manera de vectorizar esto para evitar el for-loop? (¿Y se puede hacer con qplot?) Soy nuevo en ggplot2 y sí, lo leo en el sitio, el libro y los ejemplos de Hadley.

Segundo problema: la configuración alfa en la estética no impide que los rectángulos ocluyan el fondo. ¿Cómo obtener transparencia?

dat <- data.frame(my_x_series=1:192, my_y_series=5.0*runif(192)) 
# (ymin, ymax are computed for this series using min/max(na.rm==TRUE)) 
ymax <- 5.0 
ymin <- 0.0 
p <- ggplot(dat, aes(x=my_x_series,alpha=0.9)) 
alternate_daily_bars_xmin <- c(4,52,100,148) 

for (shade_xmin in alternate_daily_bars_xmin) { 
    shade_xmax <- min(shade_xmin+24, 192) # clamp at end of x-range 
    p <- p + geom_rect(aes(alpha=0.5,xmin=shade_xmin,xmax=shade_xmax,ymin=ymin,ymax=ymax), fill='gray80') 
} 
p <- p + geom_point(aes(y=my_y_series)) 
p 
+0

Alta definición aleatoria de dat * * para la reproducibilidad. Es la sintaxis del comando lo que me está golpeando. Supongo que cada geom_rect anula el último en lugar de componer como podrías esperar. – smci

Respuesta

26

Para trazar sus rectángulos, cree un marco de datos donde cada fila contiene las coordenadas para un único rectángulo. Esta construcción funciona para todos los polígonos, no solo para rectángulos. Una vez que sepa esto, es fácil evitar el ciclo.

Entonces, solo tenga cuidado ya sea que asigne una variable a una estética o no. En su caso, debe configurar alpha al valor que desee, para que no forme parte de la configuración aes().

library(ggplot2) 

dat <- data.frame(my_x_series=1:192, my_y_series=5.0*runif(192)) 
rect_left <- c(4,52,100,148) 
rectangles <- data.frame(
    xmin = rect_left, 
    xmax = rect_left + 24, 
    ymin = 0, 
    ymax = 5 
) 

ggplot() + 
    geom_rect(data=rectangles, aes(xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax), 
      fill='gray80', alpha=0.8) + 
    geom_point(data=dat, aes(x=my_x_series, y=my_y_series)) 

enter image description here

+0

Hermoso. ¿Se puede hacer todo o parte de esto con * 'qplot()' *? – smci

+9

Probablemente todo, pero nunca me he molestado en 'qplot'. 'ggplot' no es realmente difícil de aprender, y siempre sabes exactamente lo que obtendrás. Lo siento. – Andrie

Cuestiones relacionadas