2013-03-03 16 views
5

Próbuję utworzyć wykres rastrowy (jak diagram hovmollera) i miałem nadzieję, że ktoś może pomóc. Przyjrzałem się pomocy z rasterVis i niektórymi innymi, ale nie udało mi się uzyskać ich przykładów w celu dopasowania do moich danych, co prawdopodobnie wymaga transformacji w pewien sposób, który mi umyka. Udało mi się utworzyć wykres, ale wartości wypełnienia komórek nie odpowiadają pierwotnym danym. Skopiowałem plik dput() z przykładu mojej ramki danych (mam nadzieję, że jest to właściwy sposób). To, czego chcę, to dni w roku (DOY) wzdłuż osi x z osią y 48 prostokątów (kolumna godzinowa w DF) nad każdym DOY. Te prostokąty będą reprezentowały półgodzinne odstępy dla każdego DOY i będą barwione zgodnie z ich odpowiednią wartością (kolumna qc w DF), która wynosi 0,1 lub 2Tworzenie wykresu rastrowego w R

Do tej pory wymyśliłem następujący kod, ale tam wydaje się, że problem z przydziałem wartości z (kolumna QC) do koloru, myślę, że wartości nie są w kolejce właściwie z jakiegoś powodu ...

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) 

Co wydaje się dzieje jest to, że matryca wartości wypełnienia (z) jest nakładana wzdłuż dolnej osi x najpierw (od lewej do prawej), a następnie pętla do góry, podczas gdy ja potrzebuję jej, aby rozpocząć w lewym dolnym rogu i przejść w górę, a następnie w pętli od lewej do prawej (mam nadzieję, że ma sens!) Moje przykładowe dane obejmują tutaj tylko trzy dni, ale pełny zbiór danych będzie obejmował cały rok (366 w 2012 r.). Dzięki z góry za wszelką pomoc,

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

Coś jak 'biblioteka (raster), fabuła (raster (t (z)))'? –

Odpowiedz

4

blisko! Spróbuj coś takiego (x i y są generowane przez kod powyżej):

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 z pakietu sp grafiką stosowanie kratowych i jest bardzo konfigurowalny w zależności od potrzeb

enter image description here

Ok, geom_tile może być lepszym wyborem (do uzyskania dużej liczby komórek rastrowych), jeśli chcesz móc odróżnić różne komórki:

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

Dziękuję za odpowiedzi, ale otrzymuję ten sam problem z niewspółosiowością wartości qc do komórek. W teście, jeśli zmienisz wszystkie wartości qc odpowiadające DOY4 do 1, to nie powinno być pionowej białej linii od ymin do ymax po lewej stronie wykresu. W jakiś sposób macierz wartości z nie działa we właściwym kierunku. – JonP

+0

Dzięki Simon, tak, chciałem rozróżnić poszczególne komórki, aby Twoje rozwiązanie było idealne, dzięki bardzo. – JonP

+0

@JonP Ok świetnie! Powinieneś teraz zaznaczyć zieloną strzałkę obok swojej odpowiedzi lub mojej, aby wskazać, że to odpowiedziała na twoje pytanie. –

3

OK got to wypracowane teraz, a raczej po prostu zbyt ...

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

Niestety, to było raczej proste niż sobie wyobrażałam. Wolałbym, aby kolory legendy były dyskretne, a nie ciągłe, ale jest to drobny szczegół. Dzięki za wkład. Jon

+0

++ za bycie komunikatywnym i informatywnym w tym wątku. Mam nadzieję, że zobaczę was więcej wokół społeczności R. –

0

hovmoller funkcja z opakowania rasterVis jest przeznaczony danych 4D (współrzędne wartości liczbowej i indeksowi czasu ). Jeśli jednak się nie mylę, musisz przeprowadzić jednoargumentową serię czasową z jedną zmienną, używając wykresu poziomu.

Tutaj pokazuję przykład z lattice::levelplot.

Po pierwsze, możemy zdefiniować dane o wskaźniku czasu:

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

Następnie definiujemy dwie pomocnicze funkcje, aby wyodrębnić godzinę i dzień roku z indeksem czasu:

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

Następnie , ładujemy pakiety i definiujemy motyw z sekwencyjną paletą z pakietu RColorBrewer:

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

I wreszcie, jesteśmy gotowi, aby wyświetlić dane:

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

levelplot result

Dla pełniejszego rozwiązania, może być zainteresowany w strip function z metvurst package.