geom_rect + coord_map =非常慢

Ric*_*ord 5 r ggplot2

我正在绘制一张挪威地图,其中一个感兴趣的区域用红色矩形突出显示ggplot2.如果我省略了geom_rect或者coord_map,地图会非常快速地绘制(<1秒).如果我同时使用 - 我需要 - 它的打印和渲染速度极慢(大约五分钟).

我认为这与咀嚼有关 - 将矩形投影到新的坐标系上.有没有办法控制这个?

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
Run Code Online (Sandbox Code Playgroud)

使用低分辨率地图可以使地图绘制更快(约10秒).

hrb*_*str 6

无需诉诸墨卡托近似值:

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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

另一种选择是使用Albers等面积圆锥投影(该区域的典型投影):

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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这有一个矩形被投射的"缺点"(它也是墨卡托,没有失真).

无论哪种方式,矩形的神奇之处在于确保你只绘制一个,就像卢克说的那样.

  • 因此geom_rect在地图数据中为每一行绘制一个矩形,但是设置`data = data.frame()`会将其关闭。我很高兴地问-我自己不会很快解决这个问题。 (2认同)

luk*_*keA 5

使用coord_quickmapand 特别是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))
Run Code Online (Sandbox Code Playgroud)

geom_rect在同一点重叠annotate绘制多个矩形,只绘制一个矩形。你可以阅读有关之间的差异coord_map,并coord_quickmap在帮助文件:?coord_quickmap