Có cách nào trong R để vẽ một huyền thoại với hai trục không?


8

Tôi muốn vẽ một huyền thoại với hai trục. Cụ thể, tôi đã kết hợp hai đối tượng không gian đã được phân loại, lần đầu tiên hiển thị cường độ của một sự kiện và lần thứ hai cho thấy xác suất của sự kiện tại địa điểm đó. Tôi muốn tạo một huyền thoại cho thấy các pixel của raster kết hợp rơi vào mỗi thể loại. Truyền thuyết tôi muốn tạo ra sẽ trông giống như thế này: Truyền thuyết với hai trục .

nhập mô tả hình ảnh ở đây

Truyền thuyết bình thường của dữ liệu được phân loại trông như thế này: Truyền thuyết gốc

nhập mô tả hình ảnh ở đây

Dưới đây là một ví dụ có thể lặp lại về loại dữ liệu tôi đang sử dụng:

library(raster)
library(rasterVis)

# setseed
set.seed(999)

# create raster (example of what would be the outcome of combining intensity and probability rasters)
plot.me<- raster(xmn=-110, xmx=-90, ymn=40, ymx=60, ncols=40, nrows=40)
val <- c(100:104, 200:204, 300:304, 400:404)
plot.me<- setValues(plot.me, sample(val,ncell(plot.me),replace=T))


######  Plotting

plot.me <- ratify(plot.me)
levelplot(plot.me,att="ID" ,
          col.regions=c("#beffff","#73dfff","#d0ff73","#55ff00",
                        "#73b2ff","#0070ff","#70a800","#267300",
                        "#f5f57a","#ffff00","#e8beff","#df73ff",
                        "#f5ca7a","#ffaa00","#e600a9","#a80084"))

Lô đầu ra từ trên

nhập mô tả hình ảnh ở đây

Cách dễ nhất là tạo cốt truyện và thêm huyền thoại sau trong trình chỉnh sửa đồ họa .... nhưng tôi chắc chắn phải có cách để thực hiện điều này trong chính R! Tôi hiện đang lên kế hoạch với gói rasterVis, nhưng nếu có câu trả lời trong ggplot hoặc cơ sở R, thì chúng đều được chào đón như nhau.

Nếu nó hữu ích hơn để có một ví dụ có thể lặp lại của các bước trung gian (nghĩa là với các trình quét cường độ / xác suất) hãy cho tôi biết và tôi có thể tạo ra các bước đó.


1
Gần nhất tôi từng thấy sống trên github là github.com/clauswilke/multiscales , nhưng nó không chính xác là ví dụ của bạn.
teunbrand

1
Sử dụng rasterVistôi tạo ra hình ảnh này . Nếu đây là những gì bạn đang tìm kiếm, hãy thử mã có sẵn ở đây (phần "Huyền thoại
Bivariate

@ OscarPerpiñán Tôi cảm thấy như ví dụ của bạn là gần nhất với những gì tôi hy vọng (có thể vẽ huyền thoại trên bản đồ). Tôi đang gặp khó khăn khi hiểu một phần mã của bạn - mục đích của bước pList là gì? Điều đó có cần thiết để làm cho các bước tiếp theo hoạt động chính xác không, hay nó cụ thể cho bản đồ bạn đang tạo?
dee_2_dee

1
@ dee_2_dee Bước này tạo ra một danh sách các ô cấp độ, mỗi ô tương ứng với một lớp (xem mã ở trên, trong phần "Dữ liệu phân loại"). Danh sách này được thu gọn thành một âm mưu toàn cầu với Reduce+.trellis.
Oscar Perpiñán

Câu trả lời:


4

Một giải pháp sẽ là tạo hai ô và kết hợp chúng bằng cách sử dụng grid.arrangechức năng từ gridExtragói chẳng hạn

Đầu tiên, tôi chuyển đổi rasterLayer của bạn thành một tibble bằng cách sử dụng chức năng được đăng trên bài đăng này: Lớp phủ raster trên bản đồ trong ggplot2 trong R?

(PS: Tôi đã sửa đổi valđối tượng của bạn để chỉ tạo 16 màu khác nhau phù hợp với mẫu màu bạn cung cấp. Trong ví dụ của bạn, valcó 20 giá trị khác nhau)

val <- c(101:104, 201:204, 301:304, 401:404) # correction from OP's question to match 16 different values

library(raster)
gplot_data <- function(x, maxpixels = 50000)  {
  x <- raster::sampleRegular(x, maxpixels, asRaster = TRUE)
  coords <- raster::xyFromCell(x, seq_len(raster::ncell(x)))
  ## Extract values
  dat <- utils::stack(as.data.frame(raster::getValues(x))) 
  names(dat) <- c('value', 'variable')

  dat <- dplyr::as.tbl(data.frame(coords, dat))

  if (!is.null(levels(x))) {
    dat <- dplyr::left_join(dat, levels(x)[[1]], 
                            by = c("value" = "ID"))
  }
  dat
}

df <- gplot_data(plot.me)

Sau đó, tôi tạo ra âm mưu nắm tay, bản đồ nhiệt bằng cách sử dụng geom_tile:

library(ggplot2)
plot <- ggplot(df, aes(x = x, y = y, fill = as.factor(value)))+
  geom_tile(show.legend = FALSE)+
  coord_fixed(ratio = 20/20)+
  scale_fill_manual(values = c("#beffff","#73dfff","#d0ff73","#55ff00",
                               "#73b2ff","#0070ff","#70a800","#267300",
                               "#f5f57a","#ffff00","#e8beff","#df73ff",
                               "#f5ca7a","#ffaa00","#e600a9","#a80084"))+
  scale_y_continuous(name = "Latitude",labels = paste(c(40,45,50,55,60),"°N"))+
  scale_x_continuous(name = "Longitude",labels = paste(c(-110,-105,-100,-95,-90),"°W"))+
  theme_linedraw()+
  theme(panel.border = element_rect(size = 2),
        axis.text = element_text(size = 10),
        axis.title = element_text(size = 10),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank())

Sau đó, tôi tạo một khung dữ liệu riêng cho chú giải:

library(tidyverse)
df_legend <- data.frame(value = unique(df$value))
df_legend <- df_legend %>% rowwise() %>% 
  mutate(Dim1 = unlist(strsplit(as.character(value),""))[1],
         Dim3 = unlist(strsplit(as.character(value),""))[3])

Source: local data frame [16 x 3]
Groups: <by row>

# A tibble: 16 x 3
   value Dim1  Dim3 
   <int> <chr> <chr>
 1   404 4     4    
 2   204 2     4    
 3   304 3     4    
 4   104 1     4    
 5   202 2     2    
 6   302 3     2    
 7   203 2     3    
 8   301 3     1    
 9   402 4     2    
10   401 4     1    
11   303 3     3    
12   102 1     2    
13   201 2     1    
14   103 1     3    
15   403 4     3    
16   101 1     1    

Bây giờ, tôi đã thực hiện cốt truyện cho huyền thoại:

legend <- ggplot(df_legend, aes(x = as.factor(Dim1), y = as.factor(Dim3), fill = as.factor(value)))+
  geom_tile(show.legend = FALSE, color = "black")+
  coord_fixed(ratio = 1)+
  scale_fill_manual(values = c("#beffff","#73dfff","#d0ff73","#55ff00",
                               "#73b2ff","#0070ff","#70a800","#267300",
                               "#f5f57a","#ffff00","#e8beff","#df73ff",
                               "#f5ca7a","#ffaa00","#e600a9","#a80084"))+
  theme_linedraw()+
  labs(x = "Dim1", y = "Dim3")+
  theme(panel.border = element_rect(size = 2),
        axis.text = element_text(size = 10),
        axis.title = element_text(size = 10))

Và cuối cùng, tôi kết hợp chúng:

library(gridExtra)
grid.arrange(plot, legend, layout_matrix = rbind(c(1,1,2),c(1,1,3)))

nhập mô tả hình ảnh ở đây

Nó có nhìn những gì bạn đang cố gắng để có được?


Lưu ý: Bạn có thể vẽ trực tiếp đối tượng raster của mình vào ggplot2nhưng tôi không chắc chắn về quy trình chính xác. Ngoài ra, bạn có thể chơi với bố cục grid.arrangeđể làm cho cốt truyện trông chính xác như bạn muốn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.