【问题标题】:Plot Map of Pacific with filled countries填充国家的太平洋地图
【发布时间】:2013-09-25 00:27:13
【问题描述】:

我正在尝试使用 R 的 mapproj 库中的 World2Hires 绘制太平洋地图,但是当我尝试填充这些国家/地区时出现了一个奇怪的故障。我该如何解决?

library(maps)
library(mapproj)
library(mapdata)
map("world2Hires", 
    xlim=c(120, 260), 
    ylim=c(-60, 40), 
    boundary=TRUE, 
    interior=TRUE,
    fill=TRUE,
    col="gray30",
)
map.axes()

这是输出:

【问题讨论】:

标签: r map


【解决方案1】:

问题似乎与导致缠绕的一小部分区域有关。通过一些试验和错误来保存原始的map 调用,如mapnames <- map(...),然后将此列表的子集传递给新调用中的regions= 参数,我可以避免填充的环绕。例如:

library(maps)
library(mapproj)
library(mapdata)
map("world2Hires", regions=mapnames$names[c(1:7,14:641)],
    xlim=c(120, 260), 
    ylim=c(-60, 40), 
    boundary=TRUE, 
    interior=TRUE,
    fill=TRUE
)
map.axes()

关于防止这种情况发生的更彻底或更明智的解决方案,我很难过。使用wrap= 选项没有任何帮助,其他选项也是如此。附带说明一下,使用 "world" 数据库时不会出现此问题,而只会弹出 "world2""world2Hires"

【讨论】:

【解决方案2】:

@thelatemail 的答案是我见过的解决这个问题的最好和最简单的解决方案。但是,为了使其更通用,最好按名称删除多边形。这是因为根据您首次调用 map() 的限制,多边形名称的索引可能会有所不同。

library(maps)
library(mapproj)
library(mapdata)

mapnames <- map("world2Hires", xlim=c(120, 260), ylim=c(-60, 40),
                fill=TRUE, plot=FALSE)

mapnames2 <- map("world2Hires", xlim=c(100, 200), ylim=c(-20, 60),
                 fill=TRUE, plot=FALSE)

mapnames$names[10]
[1] "Mali"
mapnames2$names[10]
[1] "Thailand"

有 8 个国家与本初子午线相交:英国、法国、西班牙、阿尔及利亚、马里、布基纳法索、加纳和多哥。通过将这些国家/地区名称与mapnames$names 匹配,您可以删除多边形,而不管您的原始范围如何:

remove <- c("UK:Great Britain", "France", "Spain", "Algeria", "Mali",
            "Burkina Faso", "Ghana", "Togo")

map("world2Hires", regions=mapnames$names[!(mapnames$names %in% remove)],
    xlim=c(120, 260), 
    ylim=c(-60, 40), 
    boundary=TRUE, 
    interior=TRUE,
    fill=TRUE
)
map.axes()

您也可以使用 grepl() 但由于多边形是按层次命名的,您可以删除相关国家的一些子多边形。例如,mapnames$names[grepl("UK", mapnames$names)] 返回 34 个匹配项。

我会建议将此作为编辑,但我还没有权限。

【讨论】:

  • 这是对上一个答案的扩展。确定问题国家的特定子集非常有帮助。如果你继续发布这样有用的东西,你的特权不会持续太久。
  • 谢谢@thelatemail!我还想到,无论您的地图中断在哪里,都可能有解决方案。这可以通过在多边形上覆盖 N-S 线(在您的断裂经度处)来识别它与哪些多边形相交来完成。也许超过(线,多边形)?
  • 有这个答案stackoverflow.com/questions/5353184/… 重新排列跨越经度线的多边形。
  • 我认为您在上面链接的@Joris Meys 回答可能仍然是最优雅的解决方案,但不像您的那么简单。另一个有趣的解决方案来自 kohske:stackoverflow.com/questions/10620862/…
  • 它不适用于整个世界 (xlim=c(0, 360), ylim=c(-90, 90))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-04
  • 1970-01-01
  • 2019-12-16
  • 2021-03-03
  • 2018-02-15
  • 2017-10-03
  • 2019-04-16
相关资源
最近更新 更多