使用facet wrap并使用geom_sf映射不同的状态

Séb*_*tte 10 r ggplot2 r-sf

首先,我知道这个答案:使用facet wrap在R中映射不同的状态
但我使用库的对象sf.
似乎facet_wrap(scales = "free")不适用于使用geom_sfggplot2 绘制的对象.我收到这条消息:

Erreur:只有coord_cartesian()和 支持自由音阶coord_flip()

有没有我错过的选择?
任何人都可以在不被迫使用cowplot(或任何其他网格范围)的情况下解决问题?

的确,这是一个例子.我想分别展示不同的法国地区,但有自己的x/y限制.

没有scale ="free"的结果

使用整个地图的范围计算尺度.

FRA <- raster::getData(name = "GADM", country = "FRA", level = 1)
FRA_sf <- st_as_sf(FRA)

g <- ggplot(FRA_sf) +
  geom_sf() +
  facet_wrap(~NAME_1)
Run Code Online (Sandbox Code Playgroud)

具有geom_sf的构面区域

使用cowplot的结果

我需要使用ggplots列表然后将它们组合起来.这是目标输出.它更清洁.但我也想要一个干净的方式来添加一个传奇.(我知道可能有一个共同的传说,就像在另一个SO问题中: facet wrap扭曲R中的状态图)

g <- purrr::map(FRA_sf$NAME_1,
           function(x) {
             ggplot() +
               geom_sf(data = filter(FRA_sf, NAME_1 == x)) +
               guides(fill = FALSE) +
               ggtitle(x)
           })

g2 <- cowplot::plot_grid(plotlist = g)
Run Code Online (Sandbox Code Playgroud)

具有geom_sf和cowplot的构面区域

www*_*www 6

我知道您正在寻找使用的解决方案ggplot2,但是我发现tmap可以根据您的需要选择包装。的语法tmap类似于ggplot2,它也可以带sf对象。以您FRA_sf为例,我们可以做这样的事情。

library(tmap)

tm_shape(FRA_sf) +
  tm_borders() +
  tm_facets(by = "NAME_1")
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

或者我们可以geom_spatialggspatial包中使用,但geom_spatial只接受Spatial*对象。

library(ggplot2)
library(ggspatial)

ggplot() +
  geom_spatial(FRA) + # FRA is a SpatialPolygonsDataFrame object
  facet_wrap(~NAME_1, scales = "free")
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

  • 虽然我很欣赏 `tmap` 中的工作,但我依赖于 `geom_sf()` 并且这不是“使用 geom_sf 映射不同状态”的答案,因此不应该是公认的答案。就跳出框框思维而言,这是一个很好的答案,但它没有回答OP的问题。OP 对这个答案感到满意,这使得事情变得不必要地复杂。 (7认同)