在 ggplot2 中绘制带有海洋的地图的一小块区域

Plot a small region of a map with ocean in ggplot2

我正在尝试使用 ggplot2 包绘制加拿大的某些部分。我知道保留整个多边形可能很棘手,因为 ggplot 正在摆脱限制之外的点(如果您在 scale_x/y_continuous() 中使用 limits)。为了克服这个问题,绘制整个地图然后应用缩放 (coord_map) 是很有用的。我的多边形都很好,只是海洋的颜色与 Canada/Alaska 相同。但是,如果我看整个地图,它是白色的。

一个工作示例:

require(rgdal)
require(ggplot2)
YK <- map_data("world")  ##World

## Regions Canada
library(autoimage)
data(canada)
library(broom)
canada_df <- tidy(canada)


p <- (ggplot() 
      + theme_bw()
      + geom_polygon(data = YK, aes(x=long, y = lat, group = group), fill="gray70")
      + geom_path(data = canada_df, aes(x=long, y=lat, group=group), colour="black"))
p

这给出了正确的世界地图:

然后如果我想放大加拿大西部:

p <- (ggplot() 
      + theme_bw()
      + geom_polygon(data = YK, aes(x=long, y = lat, group = group), fill="gray70")
      + geom_path(data = canada_df, aes(x=long, y=lat, group=group), colour="black")
      + coord_map("mercator", xlim=c(-150, -120), ylim=c(50, 70)))
p

这给出:

区域是正确的,但是太平洋应该在左边是白色的... 所以我尝试了另一种方式:

p <- (ggplot() 
      + theme_bw()
      + geom_polygon(data = YK, aes(x=long, y = lat, group = group), fill="gray70")
      + geom_path(data = canada_df, aes(x=long, y=lat, group=group), colour="black")
      + scale_x_continuous(limits = c(-150, -120))
      + scale_y_continuous(limits = c(50, 70)))
p

给出:

海洋是白色的,但除此之外,多边形被裁剪​​了...

有没有办法让整个多边形和白色的海洋缩放?因为这样,就好像一切都是大陆一样...

谢谢!

正如@Phil 所提到的,当您要求 ggplot 绘制加拿大的次区域时,YK 层出现了问题。我没有时间剖析这个问题。但是,我猜测,当您要求 ggplot 对 YK 数据进行子集化时,多边形数据点的顺序可能会发生变化。除非您有理由从世界地图中提取多边形数据的子集,否则我会执行以下操作。我使用栅格包从 GAMD 下载了多边形数据并将其转换为数据框。我画图的时候用的是geom_cartogram(),和geom_map()差不多。正如您指定的 long/lat,我使用 scale_x/y_continuous() 在加拿大绘制了一个分区。很抱歉无法剖析问题背后的原因。但是,我希望这张地图能让你开始。

编辑

我调查了你的第二个案例是怎么回事。我使用 ggplot_build() 访问了你的图形和我的图形后面的数据框。第一个块用 scale_x/y_continuous() 显示图形后面的数据框。我展示了一部分数据。如您所见,y 值没有按顺序排列。可以看到Y值中间有NA

             x         y map_id PANEL group colour fill size linetype alpha
9593         NA 50.13589   187     1     NA gray70  0.5        1    NA
9594         NA 50.15318   187     1     NA gray70  0.5        1    NA
9595         NA 50.13906   187     1     NA gray70  0.5        1    NA
9596         NA 50.09707   187     1     NA gray70  0.5        1    NA
9597         NA 50.04688   187     1     NA gray70  0.5        1    NA
9598         NA 50.00244   187     1     NA gray70  0.5        1    NA
9599         NA       NA   187     1     NA gray70  0.5        1    NA
9600         NA       NA   187     1     NA gray70  0.5        1    NA
9601         NA       NA   187     1     NA gray70  0.5        1    NA
9602         NA       NA   187     1     NA gray70  0.5        1    NA
9603         NA       NA   187     1     NA gray70  0.5        1    NA
9604         NA 50.00000   187     1     NA gray70  0.5        1    NA
9605         NA 50.02388   187     1     NA gray70  0.5        1    NA
9606         NA 50.05283   187     1     NA gray70  0.5        1    NA
9607         NA 50.09414   187     1     NA gray70  0.5        1    NA
9608         NA 50.12988   187     1     NA gray70  0.5        1    NA
9609         NA 50.14380   187     1     NA gray70  0.5        1    NA

此块显示了我的绘图背后的部分数据。如您所见,y 值是有序的。就我检查的数据而言,我没有看到 NA 停留在 y 值的中间。

我仍然不确定是什么导致了这种差异。然而,很明显,当您绘制第二张加拿大地图时,您的 YK 数据出现了问题。

                x        y map_id PANEL group colour   fill size linetype alpha

770            NA 53.62133      1     1     1  black gray70  0.3        1    NA
771            NA 53.62124      1     1     1  black gray70  0.3        1    NA
772            NA 53.62115      1     1     1  black gray70  0.3        1    NA
773            NA 53.62107      1     1     1  black gray70  0.3        1    NA
774            NA 53.62097      1     1     1  black gray70  0.3        1    NA
775            NA 53.62088      1     1     1  black gray70  0.3        1    NA
776            NA 53.62083      1     1     1  black gray70  0.3        1    NA
777            NA 53.62079      1     1     1  black gray70  0.3        1    NA
778            NA 53.62070      1     1     1  black gray70  0.3        1    NA
779            NA 53.62061      1     1     1  black gray70  0.3        1    NA

代码

library(raster)
library(tidyverse)
library(ggalt)
library(ggthemes)

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

g <- ggplot() +
     geom_cartogram(data = foo, aes(x = long, y = lat, map_id = id), map = foo,
                    fill = "gray70", color = "black", size = 0.3) + 
     scale_x_continuous(limits = c(-150, -120)) +
     scale_y_continuous(limits = c(50, 70)) +
     theme_map()

如评论中所述,Chika 想要在地图中显示阿拉斯加。原来如此。

canada <- getData("GADM", country = "canada", level = 1)
usa <- getData("GADM", country = "usa", level = 1)
alaska <- subset(usa, NAME_1 == "Alaska")

ca <- fortify(canada)
al <- fortify(alaska)

g <- ggplot() +
     geom_cartogram(data = al, aes(x = long, y = lat, map_id = id), map = al) +
     geom_cartogram(data = ca, aes(x = long, y = lat, map_id = id), map = ca) +
     scale_x_continuous(limits = c(-170, -120)) +
     scale_y_continuous(limits = c(50, 70))

似乎问题出在 coord_map。如果使用 coord_cartesiancoord_fixed 放大就可以了。 coord_quickmap 也有效。

p <- ggplot() +
      theme_bw() +
      geom_polygon(data = YK, aes(x=long, y = lat, group = group), fill="gray70") +
      geom_path(data = canada_df, aes(x=long, y=lat, group=group), colour="black")
p

p + coord_cartesian(xlim=c(-150, -120), ylim=c(50, 70))

p + coord_fixed(ratio = 2, xlim=c(-150, -120), ylim=c(50, 70))


p + coord_quickmap(xlim=c(-150, -120), ylim=c(50, 70))

a new package, which makes plotting oceans in ggplot easier个。该软件包应该很快就会在 CRAN 上可用。在撰写本文时,您需要安装来自 GitHub:

的软件包
devtools::install_github("MikkoVihtakari/ggOceanMapsData") # required by ggOceanMaps
devtools::install_github("MikkoVihtakari/ggOceanMaps")

在撰写本文时,安装可能需要更新 R,因为其中一个依赖项需要 sf >= 0.9。安装包后,制作地图很简单:

library(ggOceanMaps)
#> Loading required package: ggplot2
#> Loading required package: ggspatial
#> Loading required package: ggOceanMapsData
basemap(limits = c(-150, -120, 50, 70), rotate = TRUE)

您可能想尝试一下这些限制,但这提供了一个想法。如果你想要州边界,只需使用原始 sp shapefile 和 + layer_spatial(data = YK, fill = NA, color = "black")

绘制它们

reprex package (v0.3.0)

于 2020-04-27 创建

编辑 2021-02-22:package is now available on CRAN.