2015-04-19 13 views
7

Sono nel bel mezzo della costruzione di un grafico a linee temporali utilizzando ggplot2 che utilizza oggetti geom_rect per evidenziare un particolare evento di serie storiche.Come posso applicare un riempimento sfumato a un oggetto geom_rect in ggplot2?

Per ragioni puramente estetiche, mi interessa applicare un gradiente all'oggetto geom_rect in modo che sfuma in bianco/trasparente mentre y aumenta.

Ho letto altre risposte in cui è stato suggerito che geom_tile o geom_raster possono offrire una soluzione. Non ho avuto fortuna con questo ... per me, geom_rect sembra essere la scelta più ovvia dato che posso specificare l'inizio e la fine delle serie temporali come limiti. Tuttavia, spero di poter essere smentito! Se qualcuno ha una guida, sarebbe molto apprezzato. Il mio tentativo finora è:

## READ DATA 

file = "Data.csv" 
timeSeries <- read.csv(file, header=TRUE) 

## CONVERT DATA TO DATE CLASS 

timeSeries$Date <- as.Date(timeSeries$Date, "%d/%m/%y") 
timeSeries$Date <- as.Date(format(timeSeries$Date, "19%y-%m-%d")) 

## SET GEOM_RECT DATA FRAME 

event <- c("Event1", "Event2", "Event3") 
startDate <- c("15/06/15", "12/07/17", "6/09/18") 
finishDate <- c("9/01/16", "18/11/17", "5/11/18") 

dates <- cbind(event, startDate, finishDate) 
dates <- as.data.frame(dates, rownames=NULL, stringsAsFactors=FALSE) 

dates$startDate <- as.Date(dates$startDate, "%d/%m/%y") 
dates$startDate <- as.Date(format(dates$startDate, "19%y-%m-%d")) 

dates$finishDate <- as.Date(dates$finishDate, "%d/%m/%y") 
dates$finishDate <- as.Date(format(dates$finishDate, "19%y-%m-%d")) 

## PLOT USING GGPLOT 

plot <- ggplot(timeSeries) + 
      geom_rect(data=dates, aes(xmin=startDate, xmax=finishDate, ymin=0,  ymax=25), fill="blue", alpha=0.4) + 
      geom_line(aes(x=Date, y=Event)) + 
      scale_x_date(labels=date_format("19%y")) + 
      ggtitle("") + 
      xlab("Time Series") + 
      ylab("Number") + 
theme_minimal() 
plot 

Il codice sopra dovrebbe produrre questo grafico. I dati possono essere scaricati da here.

Time Series

+0

si hanno due opzioni: i) discretise i rettangoli lungo y e mappare il riempimento o alfa a quella variabile; ii) post-processare la trama, ad es. tramite gridSVG, che supporta i riempimenti a gradiente nativi. Ci sono alcuni esempi sul web (grid.garnish IIRC) – baptiste

+0

Grazie @baptiste, la mia preferenza sarebbe fare tutto questo in ggplot. Come potrei fare per ottenere l'opzione i)? Non sono stato in grado di mappare una sfumatura su un oggetto geom_rect in precedenza? – vengefulsealion

risposta

8

Ecco la mia implementazione di @ Baptiste idea. Sembra stravagante!

ggplot_grad_rects <- function(n, ymin, ymax) { 
    y_steps <- seq(from = ymin, to = ymax, length.out = n + 1) 
    alpha_steps <- seq(from = 0.5, to = 0, length.out = n) 
    rect_grad <- data.frame(ymin = y_steps[-(n + 1)], 
          ymax = y_steps[-1], 
          alpha = alpha_steps) 
    rect_total <- merge(dates, rect_grad) 
    ggplot(timeSeries) + 
    geom_rect(data=rect_total, 
       aes(xmin=startDate, xmax=finishDate, 
        ymin=ymin, ymax=ymax, 
        alpha=alpha), fill="blue") + 
    guides(alpha = FALSE) 
} 

ggplot_grad_rects(100, 0, 25) + 
    geom_line(aes(x=Date, y=Event)) + 
    scale_x_date(labels=date_format("19%y")) + 
    ggtitle("") + 
    xlab("Time Series") + 
    ylab("Number") + 
    theme_minimal() 

enter image description here

+0

Hey @tonytonov grazie mille per questo. Ha funzionato perfettamente e sembra fantastico. Davvero apprezzato. – vengefulsealion

+0

Siete i benvenuti! – tonytonov

Problemi correlati