2016-06-05 2 views
5

Я планирую карту Норвегии с интересной областью, выделенной красным прямоугольником, с использованием ggplot2. Если я опускаю geom_rect или coord_map, карта отображает очень быстро (< 1 секунда). Если я использую оба - что мне нужно - очень медленно печатать и делать (около пяти минут).geom_rect + coord_map = очень медленно

Я предполагаю, что это как-то связано с жеванием - проецирование прямоугольника на новую систему координат. Есть ли способ контролировать это?

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 

Использование карты с низким разрешением делает карту намного быстрее (около 10 секунд).

ответ

5

Нет необходимости прибегать к 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

Другим вариантом было бы использовать проекция альберса (типичный один для этого региона):

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

Это имеет «недостаток» проецируемого прямоугольника (именно с Меркатором тоже нет искажений).

В любом случае, магия для прямоугольника гарантирует, что вы замышляете только один, как сказал Люк.

+1

Так geom_rect рисовал один прямоугольник для каждой строки в данных карты, но установка 'data = data.frame()' отключает это. Рад, что я спросил, - я бы так быстро не справился сам. –

4

Использование coord_quickmap и особенно annotate вместо geom_rect, чтобы ускорить процесс:

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 несколько прямоугольников на том же самом месте, annotate только участки один прямоугольник. Вы можете прочитать о разнице между coord_map и coord_quickmap в файлах справки: ?coord_quickmap.

Смежные вопросы