在R中的较大地图内创建插图

时间:2014-01-21 21:06:38

标签: r plot ggplot2 maps

我正在尝试使用加拿大海上省份的插图来制作我的野外地图。到目前为止,我有以下内容:

现场站点地图

map("worldHires", "Canada", xlim=c(-65.5,-64), ylim=c(45.5,46.35), col="gray90", fill=TRUE)
box(which="plot", lty="solid")
par(mar=c(0,0,0,0))
points(coord$long, coord$lat, col=coord$sp, pch=20, cex=0.75)
legend(-65.5, 46.35, c("BARS, CLSW & TRES", "BANS", "TRES"), col=c(2,1,3), pch=20, cex=0.75)

coord $ long和coord $ lat是我每个站点的纬度和长坐标,coord $ sp表示每个站点的物种。

海事的插图

map("worldHires", "Canada", xlim=c(-68,-59.9), ylim=c(43.5,48), col="gray90", fill=TRUE)
box(which="plot", lty="solid")
par(mar=c(0,0,0,0))
rect(-65.5, 45.5, -64, 46.35, angle=45)

我遇到了将插图映射到字段站点地图左下角的问题。我查看了以下选项:

    来自此问题(Layout with 'maps' package)的
  1. layout()选项,但这并未将插入地图放在我的其他地图中

  2. 此问题(http://r.789695.n4.nabble.com/inset-one-map-on-top-of-another-map-td3848752.html)中的par(usr =)选项,但我不知道如何确定计算的值

  3. 此示例中的
  4. par(plt =)选项(http://wiki.cbr.washington.edu/qerm/sites/qerm/images/7/78/MakingAnInsetMapShorter.r),但同样,我不知道如何确定值。

  5. 其中一个潜在的混淆问题是我上面用来创建这些地图的代码可能没有使用整个绘图窗口 - 但我不知道如何改变它。

    非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

这个问题已经放弃了将近三年。但是,我认为值得提供答案,因为关于如何在堆栈溢出上绘制插入映射的信息不足。

我选择了ggplot2来处理这个任务。首先,我使用getData()包中的raster下载了SpatialPolygonsDataFrame。我将数据转换为常规数据帧,这是ggplot所需要的。然后,我绘制了主地图(即g1)。我使用geom_blank()来为ggplot提供经度和纬度。过去我们可以在geom_map()中添加long和lat,但当前版本的ggplot不接受long和lat分别为x和y。我使用scale_x_continuous()scale_y_continuous()修剪了地图。然后,我绘制了插图(即g2)。由于我需要绘制一个矩形,我创建了一个名为temp的数据框。我以类似的方式画了地图。确保将插入地图视为眉头对象;你需要使用ggplotGrob()。最后一步是在主地图中添加插图。您需要确定最佳位置。你想玩long和lat值。

library(raster)
library(ggplot2)
library(ggthemes)

mydata <- getData("GADM", country = "canada", level = 1)
mymap <- fortify(mydata)

g1 <-  ggplot() +
       geom_blank(data = mymap, aes(x = long, y = lat)) +
       geom_map(data = mymap, map = mymap,
                 aes(group = group, map_id = id),
                 fill = "#b2b2b2", color = "black", size = 0.3) +
       scale_x_continuous(limits = c(-65.5, -64), expand = c(0, 0)) +
       scale_y_continuous(limits = c(45.5, 46.35), expand = c(0, 0)) +
       theme_map()


temp <- data.frame(long = c(-65.5, -65.5, -64, -64, -65.5),
                   lat = c(45.5, 46.35, 46.35, 45.5, 45.5))

g2 <- ggplotGrob(
      ggplot() +
      geom_blank(data = mymap, aes(x = long, y = lat)) +
      geom_map(data = mymap, map = mymap,
               aes(group = group, map_id = id),
               fill = "#b2b2b2", color = "black", size = 0.3) +
      geom_path(data = temp, aes(x = long, y = lat), size = 0.3) +
      scale_x_continuous(limits = c(-68, -59.9), expand = c(0, 0)) +
      scale_y_continuous(limits = c(43.5, 48), expand = c(0, 0)) +
      coord_map("polyconic") +
      theme_map() +
      theme(panel.background = element_rect(fill = NULL))
      )

g3 <- g1 +
      annotation_custom(grob = g2, xmin = -65.49, xmax = -65.1,
                        ymin = 46.05, ymax = 46.34) 

enter image description here