我试图使用ggplot2构建一个映射,因为它比更快。可悲的是,我得到的地图不是我想要的。
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解决这个问题吗?
发布于 2020-06-25 05:08:00
这是可以做到的,虽然我不确定这是否真的值得努力。
这里有两个问题:
facet_wrap,您可以在scales = "free"的每个方面获得不同的尺度(在本例中是纬度/经度),但是layer_spatial只适用于coord_sf坐标系,并且coord_sf是硬编码的,只能在固定的尺度上工作(在ggplot页面上有一个讨论,说明了这是如何发生的);lims()显式地违背了自由鳞片的目的。对于第一个问题,我们可以违背软件包开发人员定义一个接受自由尺度的坐标系统的替代版本的意图。(我并不是说应该这样做,但这是可以的。(请注意。)
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。
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指向允许它的修改版本:
ggplot() +
layer_spatial(mapa[keep, ]) +
facet_wrap(~grupo, scales = "free")

https://stackoverflow.com/questions/62560181
复制相似问题