2013-03-03 17 views
5

Ich versuche, ein Raster-Diagramm (wie ein Hovmoller-Diagramm) zu erstellen und hoffte, dass jemand helfen könnte. Ich habe mir die Hilfe von rasterVis und einigen anderen angeschaut, aber ich kann mir nicht vorstellen, dass ihre Beispiele zu meinen Daten passen, was wahrscheinlich auf irgendeine Art transformiert werden muss, die mir entgeht. Ich habe es geschafft, das Diagramm zu erstellen, aber die Füllwerte für die Zellen entsprechen nicht den ursprünglichen Daten. Ich habe eine dput() - Datei eines Beispiels meines Datenrahmens kopiert (hoffe, dies ist der richtige Weg, dies zu tun). Was ich will, ist Tage des Jahres (DOY) entlang der x-Achse mit einer y-Achse von 48 Rechtecken (Stunde Spalte in DF) über jeder DOY. Diese Rechtecke würden halbstündliche Intervalle für jeden DOY darstellen und würden entsprechend ihrem entsprechenden a-Wert (qc Spalte in DF) gefärbt sein, der 0,1 oder 2Erstellen eines Raster-Plots in R

ist Bis jetzt bin ich mit dem folgenden Code aber dort gekommen scheint ein Problem mit der Zuordnung des z-Wertes (qc Spalte) auf die Farbe zu sein, denke ich, dass die Werte nicht richtig aus irgendeinem Grunde Schlange sind ...

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) 

Was das ist, dass der Fall zu sein scheint fill value matrix (z) wird zuerst am unteren Rand der x-Achse ausgeführt (von links nach rechts) und dann nach oben geschleift, während ich es in der unteren linken Ecke beginnen muss und dann nach oben und dann von links nach rechts laufen muss (hoffe, dass macht irgendwie Sinn!) Meine Beispieldaten umfassen hier nur drei Tage, aber der gesamte Datensatz wäre für ein ganzes Jahr (366 im Jahr 2012). Vielen Dank im Voraus für jede Hilfe,

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

Etwas wie 'Bibliothek (Raster); Plot (Raster (t (z)))'? –

Antwort

4

Schließen! Versuchen Sie so etwas wie dieses (x und y werden durch den Code oben):

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 aus dem Paket sp Verwendung Gitter Grafiken und ist extrem anpassbar nach Ihren Bedürfnissen

enter image description here

Ok, geom_tile könnte eine bessere Wahl sein (bis die Anzahl der Rasterzellen groß wird), wenn Sie verschiedene Zellen zu erkennen in der Lage sein wollen:

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

Danke für die Antworten, aber das gleiche Problem mit der Fehlausrichtung der qc-Werte zu den Zellen. Wenn Sie als Test alle qc-Werte entsprechend DOY4 zu 1 ändern, sollte eine vertikale weiße Linie von ymin zu ymax auf der linken Seite des Diagramms vorhanden sein. Dies geschieht nicht. Irgendwie läuft die Matrix für die z-Werte nicht in der richtigen Richtung. – JonP

+0

Danke Simon, ja ich wollte die einzelnen Zellen erkennen, also ist deine Lösung ideal, vielen Dank. – JonP

+0

@JonP Ok großartig! Sie sollten jetzt den grünen Pfeil entweder neben Ihrer Antwort oder mir ankreuzen, um anzuzeigen, dass dies Ihre Frage beantwortet hat. –

3

OK bekam dies jetzt geklappt, und ziemlich einfach zu ...

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

Sorry, das war eher einfacher als ich dachte. Ich würde es bevorzugen, wenn die Farben der Legenden eher diskret als kontinuierlich sind, aber es ist ein kleines Detail. Danke für deinen Beitrag. Jon

+0

++, um in diesem Thread sowohl kommunikativ als auch informativ zu sein. Ich hoffe, mehr von euch in der R-Community zu sehen. –

0

Die hovmoller Funktion aus dem Paket rasterVis ausgelegt ist für 4D Daten (Koordinaten, numerische Variable und eine Zeit Index). Wenn ich jedoch nicht falsch liege, müssen Sie eine univariate Zeitreihe mit einem Level Plot plotten.

Hier zeige ich ein Beispiel mit lattice::levelplot.

Zunächst definieren wir die Daten mit einem Zeitindex:

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

Als nächstes definieren wir zwei Hilfsfunktionen Stunde und Tag der Jahr aus dem Zeitindex zu extrahieren:

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

Dann , laden wir die Pakete und definieren ein Thema mit einer sequentiellen Palette aus dem RColorBrewer Paket:

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

Und schließlich sind wir bereit, die Daten anzuzeigen:

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

levelplot result

Für eine vollständigere Lösung, die Sie in den strip function der metvurst package interessiert sein könnten.