我正在绘制一张挪威地图,其中一个感兴趣的区域用红色矩形突出显示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秒).
无需诉诸墨卡托近似值:
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)
这有一个矩形被投射的"缺点"(它也是墨卡托,没有失真).
无论哪种方式,矩形的神奇之处在于确保你只绘制一个,就像卢克说的那样.
使用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。