2013-03-03 65 views
5

Tôi đang cố tạo ra biểu đồ raster (như sơ đồ hovmoller) và hy vọng ai đó có thể giúp đỡ. Tôi đã xem xét sự giúp đỡ với rasterVis và một số người khác nhưng dường như không thể lấy ví dụ của họ cho phù hợp với dữ liệu của tôi, mà có lẽ cần phải chuyển đổi theo một cách nào đó đang cản trở tôi. Tôi đã quản lý để tạo cốt truyện nhưng các giá trị điền cho các ô không tương ứng với dữ liệu gốc. Tôi đã sao chép một tập tin dput() của một ví dụ về khung dữ liệu của tôi (hy vọng đây là cách đúng để làm điều này). Những gì tôi muốn là những ngày trong năm (DOY) dọc theo trục x với một trục y 48 hình chữ nhật (cột giờ trong DF) phía trên mỗi DOY. Các hình chữ nhật này sẽ đại diện cho một nửa khoảng thời gian mỗi giờ cho mỗi DOY và sẽ được tô màu theo giá trị tương ứng của chúng (cột qc trong DF) là 0,1 hoặc 2Tạo một ô raster trong R

Cho đến nay tôi đã đưa ra mã sau đây có vẻ là một vấn đề với việc phân bổ giá trị z (cột qc) để màu sắc, tôi nghĩ rằng các giá trị được không xếp hàng đúng đối với một số lý do ...

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) 

gì dường như xảy ra là điền giá trị ma trận (z) được áp dụng chạy dọc theo phía dưới của trục x đầu tiên (trái sang phải) sau đó looping đến đầu trong khi tôi cần nó để bắt đầu ở góc dưới bên trái và đi lên sau đó vòng trái sang phải (hy vọng rằng làm cho một số loại ý nghĩa!) Dữ liệu ví dụ của tôi ở đây chỉ bao gồm ba ngày nhưng toàn bộ tập dữ liệu sẽ là toàn bộ năm (366 vào năm 2012). Cảm ơn trước sự giúp đỡ nào,

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

Thứ gì đó như 'thư viện (raster); âm mưu (raster (t (z)))'? –

Trả lời

4

Đóng! Hãy thử một cái gì đó như thế này (x và y được tạo ra bởi mã của bạn ở trên):

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 từ gói sp đồ họa sử dụng mạng và là cực kỳ tùy theo nhu cầu của bạn

enter image description here

Ok, geom_tile có thể là lựa chọn tốt hơn (cho đến khi số lượng ô raster lớn) nếu bạn muốn có thể phân biệt các ô khác nhau:

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

Cảm ơn bạn đã trả lời nhưng nhận được cùng một vấn đề với việc điều chỉnh giá trị qc cho các ô. Là một thử nghiệm, nếu bạn thay đổi tất cả các giá trị qc tương ứng với DOY4 thành 1 thì sẽ có một đường thẳng trắng từ ymin đến ymax ở bên trái của ô, điều này không xảy ra. Bằng cách nào đó ma trận cho các giá trị z không chạy đúng hướng. – JonP

+0

Cảm ơn Simon, vâng tôi đã muốn phân biệt các tế bào riêng lẻ để giải pháp của bạn là lý tưởng, cảm ơn rất nhiều. – JonP

+0

@JonP Ok tuyệt vời! Bây giờ bạn nên đánh dấu vào mũi tên màu xanh lá cây bên cạnh câu trả lời của bạn hoặc của tôi để chỉ ra rằng điều này đã trả lời câu hỏi của bạn. –

3

OK có này làm việc ra ngay bây giờ, và thay vì chỉ đơn giản là quá ...

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

Xin lỗi, đó là thay vì đơn giản hơn tôi tưởng tượng. Tôi muốn màu sắc huyền thoại được rời rạc hơn là liên tục nhưng nó là một chi tiết nhỏ. Cảm ơn vì đầu vào của bạn. Jon

+0

++ cho cả giao tiếp và thông tin trong chuỗi này. Hy vọng được gặp nhiều bạn hơn trong cộng đồng R. –

0

Chức năng hovmoller từ gói rasterVis được thiết kế cho dữ liệu 4D (tọa độ, biến số và chỉ số thời gian ). Tuy nhiên, nếu tôi không sai, bạn cần vẽ một chuỗi thời gian đơn lẻ sử dụng một âm mưu mức.

Ở đây tôi hiển thị ví dụ với lattice::levelplot.

Đầu tiên, chúng ta định nghĩa dữ liệu với một chỉ số thời gian:

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

Tiếp theo, chúng ta định nghĩa hai chức năng phụ trợ để trích xuất giờ và ngày trong năm kể từ chỉ số thời gian:

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

Sau đó, , chúng tôi tải các gói và xác định chủ đề với bảng màu tuần tự từ gói RColorBrewer:

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

Và cuối cùng, chúng tôi đã sẵn sàng để hiển thị dữ liệu:

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

levelplot result

Đối với một giải pháp hoàn chỉnh hơn, bạn có thể quan tâm đến các strip function của metvurst package.

Các vấn đề liên quan