繁体   English   中英

R 地图 - 陆地边界的表现不佳

[英]R map - poor representation of land borders

我绘制了南半球南部的地图。 我的问题是澳大利亚,它的边界很差。

我的数据:

library("maptools")
library("ggplot2")
library("tidyverse")

ylim_map <- c(-90, -30)
xlim_map <- c(-180, 180)
world <- maps::map("world", fill=TRUE, plot=FALSE, ylim = ylim_map)

为 ggplot 以正确格式转换数据:

IDs <- sapply(strsplit(world$names, ":"), function(x) x[1])
world <- map2SpatialPolygons(world, IDs = IDs, 
                             proj4string = CRS("+proj=longlat +datum=WGS84"))
world_map <- fortify(world)
world_map <- world_map[which(between(world_map$lat, ylim_map[1], ylim_map[2]) &
                               between(world_map$lon, xlim_map[1], xlim_map[2])),]

我的情节:

ggplot() +

  coord_map("orthographic", orientation = c(-90, 0, 0), 
            xlim = xlim_map, ylim = c(ylim_map[1], ylim_map[2] + 10)) +

  geom_map(data = world_map, map = world_map,
           aes(x = long, y = lat, map_id = id), fill = "black") +

  geom_text(aes(x = 180, y = ylim_map[2]+5, label = "180°E"), color = "black") +
  geom_text(aes(x = 90, y = ylim_map[2]+5, label = "90°E"), angle = -90, color = "black") +
  geom_text(aes(x = 0, y = ylim_map[2]+5, label = "0°"), color = "black") +
  geom_text(aes(x = -90, y = ylim_map[2]+5, label = "90°W"), angle = 90, color = "black") +

  labs(y = "", x = "") +

  # Theme
  theme(text = element_text(size = 20),
        panel.background = element_blank(),
        axis.title = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        axis.line = element_blank(),
        aspect.ratio = 1) 

在此处输入图片说明

TLDR :

您需要关闭多边形。

说明

让我们修剪掉无关的代码并放大到澳大利亚。 (虽然实际上非洲和南美洲也存在这个问题;只是那里没有那么明显......)

我们可以看到顶线行为不端。 它与更南部的海岸线相交,而不是坚持其正确的纬度水平:

ggplot() +
  coord_map("orthographic", orientation = c(-40, 130, 0)) +
  geom_map(data = world_map, map = world_map,
           aes(x = long, y = lat, map_id=id), 
           fill = "darkgrey") +
  theme_bw()

图 1

现在geom_map图层本质上是在绘制多边形,而?geom_polygon声明:

多边形与路径非常相似(由geom_path()绘制),除了起点和终点是连接的,并且内部由fill着色。 组美学决定了哪些案例连接在一起形成一个多边形。

如果我们将geom_map图层替换为其geom_polygon / geom_path等价物,则情况变得更加明显:澳大利亚对应的多边形没有 top line 相反,路径从一个角开始,到对角结束。 geom_polygon用一条直线将它们连接起来,当坐标系不是线性的(并且coord_map不是)时,它可能会与其他直线相交:

ggplot() +
  coord_map("orthographic", 
            orientation = c(-40, 130, 0)) +
  geom_polygon(data = world_map,
               aes(x = long, y = lat, group = group), 
               fill = "lightgrey") +
  geom_path(data = world_map,
            aes(x = long, y = lat, group = group)) +
  theme_bw()

图二

解决方案

我们可以通过在末尾重复第一个点来手动关闭每个多边形。 (对于已经闭合的多边形,这没有额外的效果。)

library(dplyr)

world_map2 <- world_map %>%
  group_by(group) %>%              # each group corresponds to a unique polygon
  arrange(order) %>%               # sort points in the appropriate sequence
  slice(c(1:n(), 1)) %>%           # repeat first row after last row
  mutate(order = seq(1, n())) %>%  # define new order for n+1 rows
  ungroup()

检查多边形现在是否已关闭,澳大利亚的顶线现在可以很好地跟踪其纬度水平:

ggplot() +
  coord_map("orthographic", 
            orientation = c(-40, 130, 0)) +
  geom_polygon(data = world_map2,
               aes(x = long, y = lat, group = group), 
               fill = "lightgrey") +
  geom_path(data = world_map2,
            aes(x = long, y = lat, group = group)) +
  theme_bw()

图 3

将此应用于原始用例:

ggplot() +

  coord_map("orthographic", orientation = c(-90, 0, 0), 
            xlim = xlim_map, ylim = c(ylim_map[1], ylim_map[2] + 10)) +

  geom_map(data = world_map2, map = world_map2,
           aes(x = long, y = lat, map_id = id), fill = "black") +

  geom_text(aes(x = 180, y = ylim_map[2]+5, label = "180°E"), color = "black") +
  geom_text(aes(x = 90, y = ylim_map[2]+5, label = "90°E"), angle = -90, color = "black") +
  geom_text(aes(x = 0, y = ylim_map[2]+5, label = "0°"), color = "black") +
  geom_text(aes(x = -90, y = ylim_map[2]+5, label = "90°W"), angle = 90, color = "black") +

  labs(y = "", x = "") +

  # Theme
  theme(text = element_text(size = 20),
        panel.background = element_blank(),
        axis.title = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        axis.line = element_blank(),
        aspect.ratio = 1) 

结果

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM