在 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_cartesian
或 coord_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.
我正在尝试使用 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_cartesian
或 coord_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.