2013-03-03 13 views
5

sto cercando di produrre un grafico raster (come un diagramma hovmoller) ed è stato sperando che qualcuno potrebbe aiutare. Ho guardato l'aiuto con rasterVis e alcuni altri, ma non riesco a ottenere i loro esempi per soddisfare i miei dati, che probabilmente ha bisogno di trasformarsi in qualche modo che mi sfugge. Sono riuscito a creare il grafico ma i valori di riempimento per le celle non corrispondono ai dati originali. Ho copiato un file dput() di un esempio del mio frame di dati (spero che questo sia il modo giusto per farlo). Quello che voglio sono i giorni dell'anno (DOY) lungo l'asse x con un asse y di 48 rettangoli (colonna delle ore in DF) sopra ogni DOY. Questi rettangoli rappresenterebbero mezzo intervalli orari per ogni DOY e sarebbe colorato secondo il corrispondente valore (colonna qc in DF) che è 0,1 o 2Produrre una trama raster in R

Finora sono venuto con il seguente codice ma ci sembra essere un problema con l'assegnazione del valore z (colonna qc) per il colore, penso che i valori non sono allineati correttamente per qualche motivo ...

mcol <- c("green","blue","red") 
x=unique(DF[,"DOY"]) 
y=unique(DF[,"hour"]) 
z=matrix(DF[,"qc"],nrow=length(unique(DF[,"DOY"])), 
        ncol=length(unique(DF[,"hour"]))) 
image(x,y,z, col=mcol, 
    xlab="Day of Year 2012", 
    ylab="Hour of day", 
    main="Hovmoller plot of 2012 qc flags", 
useRaster=TRUE) 

cosa sembra accadere è che il riempire matrice valore (z) è applicato corre lungo la parte inferiore del x primo asse (da sinistra a destra) poi loop all'inizio che ho bisogno per iniziare in basso a sinistra e risalire quindi ciclo sinistra a destra (sperare che ha una specie di senso!) I miei dati di esempio qui coprono solo tre giorni ma il set di dati completo sarebbe per un anno intero (366 nel 2012). Grazie in anticipo per qualsiasi aiuto,

Jon

structure(list(DOY = c(4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 6L, 6L, 6L, 6L), hour = c(0.5, 1, 1.5, 2, 2.5, 3, 3.5, 
4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5, 8, 8.5, 9, 9.5, 10, 10.5, 11, 
11.5, 12, 12.5, 13, 13.5, 14, 14.5, 15, 15.5, 16, 16.5, 17, 17.5, 
18, 18.5, 19, 19.5, 20, 20.5, 21, 21.5, 22, 22.5, 23, 23.5, 24, 
0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5, 
8, 8.5, 9, 9.5, 10, 10.5, 11, 11.5, 12, 12.5, 13, 13.5, 14, 14.5, 
15, 15.5, 16, 16.5, 17, 17.5, 18, 18.5, 19, 19.5, 20, 20.5, 21, 
21.5, 22, 22.5, 23, 23.5, 24, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 
4.5, 5, 5.5, 6, 6.5, 7, 7.5, 8, 8.5, 9, 9.5, 10, 10.5, 11, 11.5, 
12, 12.5, 13, 13.5, 14, 14.5, 15, 15.5, 16, 16.5, 17, 17.5, 18, 
18.5, 19, 19.5, 20, 20.5, 21, 21.5, 22, 22.5, 23, 23.5, 24), 
    qc = c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 1L, 2L, 1L, 1L, 2L, 2L, 0L, 0L, 1L, 0L, 2L, 2L, 2L, 2L, 
    2L, 2L, 0L, 2L, 2L, 0L, 0L, 1L, 2L, 0L, 2L, 0L, 1L, 2L, 1L, 
    2L, 2L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 2L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 2L, 2L, 2L, 2L, 0L, 0L, 
    2L, 0L, 0L, 0L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L)), .Names = c("DOY", 
"hour", "qc"), class = "data.frame", row.names = c(NA, -144L)) 
+1

Qualcosa come 'libreria (raster); trama (raster (t (z)))'? –

risposta

4

Chiudi! Provare qualcosa di simile (x ed y sono generate dal codice di cui sopra):

library(sp) 
r <- raster(nrows=length(y), ncols=length(x), xmn=min(x), xmx=max(x), ymn=min(y), ymx=max(y)) 
values(r) <- t(DF$qc) 
spplot(r , cuts = 2) 

spplot dal pacchetto sp grafico uso reticolo ed è estremamente personalizzabile in base alle proprie esigenze

enter image description here

Ok, geom_tile potrebbe essere una scelta migliore (fino a quando il numero di celle raster diventa grande) se si desidera poter distinguere celle diverse:

p <- ggplot(DF , aes(factor(DOY), hour)) + 
    geom_tile(aes(fill = factor(qc)) , color = "#D9D9D9") + 
    scale_fill_brewer(name="QC", type = "div" , palette = "RdBu")+ 
    scale_x_discrete(name = "Day" , expand = c(0,0)) + 
    scale_y_continuous(name = "Hour" , limits = c(0.5,24) , expand = c(0,0) , breaks = seq(0,24,2))+ 
    coord_equal() 
print(p) 

enter image description here

+0

Grazie per le risposte ma ottenendo lo stesso problema con il disallineamento dei valori qc alle celle. Come test, se modifichi tutti i valori qc corrispondenti a DOY4 a 1, allora dovrebbe esserci una linea bianca verticale da ymin a ymax alla sinistra del grafico, questo non succede. In qualche modo la matrice per i valori z non funziona nella giusta direzione. – JonP

+0

Grazie Simon, sì, volevo distinguere le singole celle così la tua soluzione è ideale, grazie mille. – JonP

+0

@JonP Ok fantastico! Ora dovresti spuntare la freccia verde accanto alla tua risposta o alla mia per indicare che questo ha risposto alla tua domanda. –

3

OK ottenuto questo ha funzionato fuori ora, e un po 'troppo ...

library(ggplot2) 
ggplot(DF,aes(DOY,hour,fill=qc))+geom_raster() 

Spiacente, che era piuttosto più semplice di quanto immaginassi. Preferirei che i colori delle legende fossero discreti piuttosto che continui, ma è un dettaglio minore. Grazie per il tuo contributo. Jon

+0

++ per essere sia comunicativo sia informativo in questo thread. Spero di vederti di più in giro per la comunità R. –

0

La funzione hovmoller dal pacchetto rasterVis è progettato per dati 4D (coordinate, variabile numerica e un indice temporale ). Tuttavia, se non sbaglio, è necessario tracciare una serie temporale univariata utilizzando un grafico a livelli.

Qui mi mostrano un esempio con lattice::levelplot.

In primo luogo, si definiscono i dati con un indice temporale:

tt <- seq(as.POSIXct('2013-01-01'), by='hour', length=8760) 
vals <- 1:24 - 12.5 
myDF <- data.frame(vals, tt) 

successivo, definiamo due funzioni ausiliarie per estrarre ora e giorno della anno dall'indice tempo:

hour <- function(x)as.numeric(format(x, '%H')) 
DoY <- function(x)as.numeric(format(x, '%j')) 

Poi , cariciamo i pacchetti e definiamo un tema con una tavolozza sequenziale dal pacchetto RColorBrewer:

library(lattice) 
library(latticeExtra) 
myTheme <- custom.theme(region=brewer.pal(n=10, 'RdBu')) 

E, infine, siamo pronti per visualizzare i dati:

levelplot(vals ~ DoY(tt)*hour(tt), 
      data=myDF, 
      xlab='Day', ylab='Hour', 
      par.settings=myTheme) 

levelplot result

Per una soluzione più completa, si può essere interessati al strip function del metvurst package.