gpt4 book ai didi

r - 在绘制世界地图时使用与本初子午线不同的中心

转载 作者:行者123 更新时间:2023-12-03 09:07:39 24 4
gpt4 key购买 nike

我正在覆盖 maps 的世界地图打包到 ggplot2光栅几何。但是,此栅格不是以本初子午线(0 度)为中心,而是以 180 度(大致白令海和太平洋)为中心。以下代码获取 map 并将 map 以 180 度居中:

require(maps)
world_map = data.frame(map(plot=FALSE)[c("x","y")])
names(world_map) = c("lon","lat")
world_map = within(world_map, {
lon = ifelse(lon < 0, lon + 360, lon)
})
ggplot(aes(x = lon, y = lat), data = world_map) + geom_path()

产生以下输出:

enter image description here

很明显,在位于本初子午线一端或另一端的多边形之间绘制了线。我目前的解决方案是用 NA 替换接近本初子午线的点,替换 within通过以下方式调用:
world_map = within(world_map, {
lon = ifelse(lon < 0, lon + 360, lon)
lon = ifelse((lon < 1) | (lon > 359), NA, lon)
})
ggplot(aes(x = lon, y = lat), data = world_map) + geom_path()

这会导致正确的图像。我现在有几个问题:
  • 必须有更好的方法将 map 集中在另一个子午线上。我尝试使用 orientation map 中的参数, 但将其设置为 orientation = c(0,180,0)没有产生正确的结果,实际上它没有改变任何结果对象( all.equal 产生了 TRUE )。
  • 在不删除一些多边形的情况下应该可以摆脱水平条纹。可能是解决点 1. 也解决了这一点。
  • 最佳答案

    这可能有点棘手,但您可以通过以下方式完成:

    mp1 <- fortify(map(fill=TRUE, plot=FALSE))
    mp2 <- mp1
    mp2$long <- mp2$long + 360
    mp2$group <- mp2$group + max(mp2$group) + 1
    mp <- rbind(mp1, mp2)
    ggplot(aes(x = long, y = lat, group = group), data = mp) +
    geom_path() +
    scale_x_continuous(limits = c(0, 360))

    enter image description here

    通过此设置,您可以轻松设置中心(即限制):
    ggplot(aes(x = long, y = lat, group = group), data = mp) + 
    geom_path() +
    scale_x_continuous(limits = c(-100, 260))

    enter image description here

    更新

    这里我做一些解释:

    整个数据看起来像:
    ggplot(aes(x = long, y = lat, group = group), data = mp) + geom_path()

    enter image description here

    但由 scale_x_continuous(limits = c(0, 360)) ,您可以裁剪从 0 到 360 经度的区域子集。

    geom_path ,同一组的数据相连。所以如果 mp2$group <- mp2$group + max(mp2$group) + 1不存在,它看起来像:
    enter image description here

    关于r - 在绘制世界地图时使用与本初子午线不同的中心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10620862/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com