首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R:用ggplot2绘制地图

R:用ggplot2绘制地图
EN

Stack Overflow用户
提问于 2020-06-24 16:51:10
回答 1查看 482关注 0票数 2

我试图使用ggplot2构建一个映射,因为它比更快。可悲的是,我得到的地图不是我想要的。

代码语言:javascript
复制
library(ggplot2)
library(raster)
library(ggspatial)


chile  <- getData("GADM",country="Chile",level=1)

chile2= chile[c(2,4:5,7,8,12:16),]
chile2$grupo=1
chile3= chile[c(1,3,6,9:11),]
chile3$grupo=2
mapa=rbind(chile2, chile3)

ggplot() +
  layer_spatial(mapa) +
  lims(x = c( -77.1,-65), y = c(-57, -15))+
  facet_wrap(~grupo)

可悲的是,上面的地图不是我所需要的。使用tmap,我得到了下面的地图,这是我真正需要的地图:

你知道如何用ggplot2解决这个问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-25 05:08:00

这是可以做到的,虽然我不确定这是否真的值得努力。

这里有两个问题:

  1. 通常,通过设置facet_wrap,您可以在scales = "free"的每个方面获得不同的尺度(在本例中是纬度/经度),但是layer_spatial只适用于coord_sf坐标系,并且coord_sf是硬编码的,只能在固定的尺度上工作(在ggplot页面上有一个讨论,说明了这是如何发生的);
  2. 设置lims()显式地违背了自由鳞片的目的。

对于第一个问题,我们可以违背软件包开发人员定义一个接受自由尺度的坐标系统的替代版本的意图。(我并不是说应该这样做,但这是可以的。(请注意。)

代码语言:javascript
复制
CoordSf2 <- ggproto("CoordSf2",
                    CoordSf,
                    is_free = function() TRUE)
trace(coord_sf, edit = TRUE)

运行trace(...)行将导致弹出窗口和coord_sf代码。将最后一节从ggproto(NULL, CoordSf, ...)修改为ggproto(NULL, CoordSf2, ...),将coord_sf指向我们修改的CoordSf2,而不是原始的CoordSf。这种效果将一直保持到当前R会话结束,或者您可以通过运行untrace(coord_sf)更早地终止它。

对于第二个问题,我认为极限被设置为只显示界限内的多边形。我们可以在数据帧中执行此过滤步骤,然后将其传递给ggplot

代码语言:javascript
复制
library(dplyr)

keep <- lapply(mapa@polygons, bbox) %>%                    # retrieve bounding box for each polygon
  lapply(function(x) c(x) <= c(-77.1, -57, -65, -15)) %>%  # compare each polygon's bbox against
  lapply(function(x) x == c(F, F, T, T)) %>%               # desired limits, if within, 
  sapply(all)                                              # results should be FFTT

keep # only the 10th polygon is outside the limits
 [1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE
[11]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE

现在,用mapa多边形的子集进行绘图,这些多边形在所需的范围内,小面尺度设置为“空闲”& coord_sf指向允许它的修改版本:

代码语言:javascript
复制
ggplot() +
  layer_spatial(mapa[keep, ]) +
  facet_wrap(~grupo, scales = "free")

但就个人而言?我可能只会制作单独的情节&将它们缝合在一起,就像在这个问题中演示的这个问题方法一样。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62560181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档