2012-05-12 11 views
11

Cosa sto facendo male qui per favore? Sto provando a ombreggiare rettangoli giornalieri di 24 ore con grigio trasparente. Ma solo l'ultimo rettangolo del ciclo for viene disegnato (?!?) Se faccio le cose manualmente invece che for-loop, funziona bene.ggplot2: come ombreggiare in modo trasparente giorni alternati su una trama

C'è un modo per vettorizzare questo per evitare il ciclo? (E può essere fatto con qplot?) Sono nuovo di ggplot2 e sì ho letto il sito, il libro e gli esempi di Hadley.

Secondo problema: l'impostazione alfa sull'estetica non impedisce ai rettangoli di occludere lo sfondo. Come ottenere la trasparenza?

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

Aggiunto definizione casuale di * dat * per la riproducibilità. È la sintassi del comando che mi sta battendo. Immagino che ogni geom_rect sovrascrive l'ultimo anziché il compositing come ci si potrebbe aspettare. – smci

risposta

26

Per tracciare i rettangoli, creare un riquadro dati in cui ogni riga contiene le coordinate per un singolo rettangolo. Questo costrutto funziona per tutti i poligoni, non solo per i rettangoli. Una volta che lo sai, è facile evitare il loop.

Quindi, state attenti a non mappare una variabile su un'estetica o meno. Nel tuo caso, devi impostare alpha in base al valore che desideri, quindi non fa parte delle impostazioni di 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

Bello. Si può fare tutto questo con * 'qplot()' *? – smci

+9

Molto probabilmente tutto, ma non mi sono mai preoccupato di 'qplot'. 'ggplot' non è molto difficile da imparare e sai sempre esattamente cosa otterrai. Scusate. – Andrie

Problemi correlati