2016-06-05 17 views
5

Tôi đang vẽ bản đồ Na Uy với diện tích được quan tâm được đánh dấu bằng hình chữ nhật màu đỏ sử dụng ggplot2. Nếu tôi bỏ qua số geom_rect hoặc coord_map, bản đồ sẽ vẽ rất nhanh (< 1 giây). Nếu tôi sử dụng cả hai - mà tôi cần - nó rất chậm để in và render (khoảng năm phút).geom_rect + coord_map = rất chậm

Tôi cho rằng đây là điều cần làm với việc nhai - chiếu hình chữ nhật lên hệ tọa độ mới. Có cách nào để kiểm soát điều này không?

library(ggplot2) 
library(maps) 
library(mapdata) 


xlim <- c(5, 10) 
ylim <- c(60, 62) 

norwaymap <- map_data("worldHires", "Norway") 
a <- ggplot(norwaymap, aes(x = long, y = lat, group = group)) + 
    geom_polygon(colour = NA, fill = "grey60") + 
    geom_rect(xmin = xlim[1], xmax = xlim[2], ymin = ylim[1], ymax = ylim[2], 
    colour = "red", fill = NA) + 
    coord_map(xlim = c(3, 33), ylim = c(57, 72)) 
print(a) # super slow 

Sử dụng bản đồ độ phân giải thấp làm cho bản đồ vẽ nhanh hơn (khoảng 10 giây).

Trả lời

5

Không cần phải dùng đến xấp xỉ Mercator:

library(ggplot2) 
library(maps) 
library(mapdata) 

norwaymap <- map_data("worldHires", "Norway") 

xlim <- c(5, 10) 
ylim <- c(60, 62) 

ggplot() + 
    geom_map(data=norwaymap, map=norwaymap, 
      aes(long, lat, map_id=region), 
      color=NA, fill="grey60") + 
    geom_rect(data=data.frame(), 
      aes(xmin=xlim[1], xmax=xlim[2], ymin=ylim[1], ymax=ylim[2]), 
      color="red", fill=NA) + 
    coord_map(xlim=c(3, 33), ylim=c(57, 72)) + 
    ggthemes::theme_map() 

enter image description here

Một lựa chọn khác là sử dụng một bình đẳng khu vực Albers chiếu hình nón (một điển hình cho khu vực đó):

ggplot() + 
    geom_map(data=norwaymap, map=norwaymap, 
      aes(long, lat, map_id=region), 
      color=NA, fill="grey60") + 
    geom_rect(data=data.frame(), 
      aes(xmin=xlim[1], xmax=xlim[2], ymin=ylim[1], ymax=ylim[2]), 
      color="red", fill=NA) + 
    ggalt::coord_proj("+proj=aea +lat_1=60 +lat_2=70 +lon_0=18.37", 
        xlim=c(3, 33), ylim=c(57, 72)) + 
    ggthemes::theme_map() 

enter image description here

Điều đó có một "bất lợi" của hình chữ nhật được chiếu (nó là với Mercator, quá, không có biến dạng).

Dù bằng cách nào, sự kỳ diệu cho hình chữ nhật là đảm bảo bạn chỉ vẽ sơ đồ một, như Luke nói.

+1

Vì vậy, geom_rect đã vẽ một hình chữ nhật cho mỗi hàng trong dữ liệu bản đồ, nhưng đặt 'data = data.frame()' sẽ tắt tính năng đó. Vui mừng tôi hỏi - sẽ không tự mình làm việc đó một cách nhanh chóng. –

4

Sử dụng coord_quickmap và đặc biệt là annotate thay vì geom_rect để tăng tốc:

ggplot(norwaymap, aes(x = long, y = lat, group = group)) + 
    geom_polygon(colour = NA, fill = "grey60") + 
    annotate(geom="rect", xmin = xlim[1], xmax = xlim[2], ymin = ylim[1], 
      ymax = ylim[2], colour = "red", fill = NA) + 
    coord_quickmap(xlim = c(3, 33), ylim = c(57, 72)) 

geom_rect overplots nhiều hình chữ nhật trên cùng một chỗ, annotate chỉ âm mưu một hình chữ nhật. Bạn có thể đọc về sự khác biệt giữa coord_mapcoord_quickmap trong các tệp trợ giúp: ?coord_quickmap.