在 R 中使用 coord_sf 在地图轴上显示度数

Displaying degrees on map axes using coord_sf in R

我正在制作地图并想使用替代投影。当我使用 coord_sf 执行此操作时,x 轴和 y 轴会获得一些其他单位的标签,例如 0.001°W。我不是地理学家,所以我不确定这些是什么。我只想查看纬度和经度...

生成基本地图的代码:

mapWorld <- borders("world", colour="gray70", fill="gray70") 
ggplot() + mapWorld +  coord_sf(xlim=c(-125, 155),ylim=c(-22,40), crs = "+proj=laea") 

结果图:

这里解决问题的最简单方法是简单地删除重投影。您看到有趣坐标的原因是您通过 coord_sf(...) 提供了不同的坐标参考系统。

#install.packages('maps')
mapWorld <- borders("world",colour="gray70", fill="gray70") 
ggplot() + mapWorld + coord_sf(xlim=c(-125, 155),ylim=c(-22,40))

更复杂的答案与您是否要使用不同的投影系统有关。在 coord_sf(xlim=c(-125, 155),ylim=c(-22,40), crs = "+proj=laea") 的地方,您正在对 geom_sf 进行修改以使用地图的不同投影。我假设您的代码 laea 指的是 Lambert Azimuthal Equal Area projection centred on Europe, right? That one has CRS code 3035.

不过,您会 运行 遇到一个问题,即要应用空间投影,您需要使用空间对象,而不是地图图片。 当您调用:borders("world",colour="gray70", fill="gray70") 时,您正在使用 ggplot2 中的快速破解从 maps 包中的数据中获取简单的 x 和 y 值。问题是 borders() 在从 maps 包中检索数据时没有将投影作为参数,因此它只需要简单的 x(long) 和 y(lat) 值并将其转换为数据框。

现在,您 可以 重新投影并仅使用 maps(和 mapproj)包绘制地图。如果您查看 maps::map 上的文档,它表明您可以提供 projection = ... 参数,但投影仅限于 mapproj 中包含的那些。例如,您可以使用方位角等积投影:

map("world", projection = "azequalarea", xlim = c(-125,155), ylim = c(-22,40))

它看起来像这样,有点难看。您可以修改它的居中方式等,但它看起来仍然不会那么好。这不应该那么令人惊讶,因为您使用的库 早于 R 本身,来自语言 S.

您可以使用更现代的工具来解决这个问题,这些工具会给您带来更大的灵活性。 ggplot 中的 geom_sf 旨在处理空间对象,理想情况下是 sf 格式,但很容易在不同类型的空间对象之间进行转换。下面是一个简单的示例,说明如何制作您心目中的地图。

首先,让我们获取世界地图作为空间数据对象

#install.packages('rnaturalearth')
#install.packages('rnaturalearthdata')
#install.packages('sf')
#install.packages('rgeos')

library(rnaturalearth)
library(rnaturalearthdata)
library(sf)

world <- ne_countries(scale = "medium", returnclass = "sf")
> world
Simple feature collection with 241 features and 63 fields
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: -180 ymin: -89.99893 xmax: 180 ymax: 83.59961
CRS:            +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0
First 10 features:

此对象附有投影 CRS:+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0。这基本上是使用纬度和经度时的默认投影,也是大多数人习惯的投影。我们可以这样绘制:

ggplot(data = world) +
  geom_sf() + 
  xlab("Longitude") + ylab("Latitude")

现在它是一个空间数据对象,可以很容易地更改投影或根据数据中的元素对其进行自定义。例如,使用 LAEA 投影代码 (3035) 并添加颜色。针对不同的大陆:

ggplot(data = world) +
  geom_sf(aes(fill = continent)) + 
  coord_sf(crs = 3035)

如果您仍然想要像 xlim=c(-125, 155),ylim=c(-22,40) 这样的边界,则在处理其他投影时需要注意这些数字代表什么。这些数字指的是 lat/lon 值,但是当我们使用其他投影时,我们必须使用这些投影所在的单位。您必须将这些限制重新投影到该特定投影使用的坐标中;但是,根据您设置的限制,我建议它们在这种类型的投影中根本无法正常工作。我建议您坚持使用 lat/long,即 CRS = 4326,如果您希望您的地图看起来像您想要的那样。

ggplot(data = world) +
  geom_sf() + 
  xlab("Longitude") + ylab("Latitude") + coord_sf(xlim=c(-125, 155),ylim=c(-22,40))