我试图使用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
然后,如果我想放大加拿大西部:
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
给出了:
海洋是白色的,但除此之外,多边形被裁剪......
有没有办法让整个多边形和海洋变白?因为像这样,好像一切都是大陆......
谢谢!
答案 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
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))
答案 2 :(得分:0)
似乎问题出在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))