在ggplot2中用海洋绘制地图的一个小区域

时间:2017-12-06 22:28:57

标签: r dictionary ggplot2 polygon ggmap

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

一个工作示例:

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

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

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

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

这给出了:

1

地区是正确的,但太平洋的左侧应为白色...... 所以我尝试了另一种方式:

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

给出了:

2

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

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

谢谢!

3 个答案:

答案 0 :(得分:1)

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创建

答案 1 :(得分:0)

正如@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值是有序的。据我检查数据,我没有看到NAs保持在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

CODE

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()

enter image description here

如评论中所述,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))

enter image description here

答案 2 :(得分:0)

似乎问题出在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))