16

首先,我知道这个答案:Mapping different states in R using facet wrap
但我使用库对象sf
似乎这facet_wrap(scales = "free")不适用于geom_sf在 ggplot2 中绘制的对象。我收到这条消息:

Erreur : 自由秤仅支持coord_cartesian()coord_flip()

有什么我错过的选择吗?
任何人都解决了这个问题而没有被迫使用cowplot(或任何其他网格排列)?

确实,这里有一个例子。我想在各个方面分别显示不同的法国地区,但有自己的 x/y 限制。

没有尺度的结果=“免费”

比例尺是根据整个地图的范围计算的。

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)

带有 geom_sf 的刻面区域

使用cowplot的结果

我需要使用 ggplots 列表,然后可以将它们组合起来。这是目标输出。它更干净。但我也想要一种干净的方式来添加图例。(我知道在另一个 SO 问题中可能有一个共同的传说: facet wrap distorts state maps in 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)

带有 geom_sf 和 cowplot 的刻面区域

4

1 回答 1

8

我知道您正在寻找使用 的解决方案ggplot2,但我发现该tmap软件包可能是一种选择,具体取决于您的需要。的语法tmap类似于ggplot2,也可以带sf对象。以你FRA_sf为例,我们可以做这样的事情。

library(tmap)

tm_shape(FRA_sf) +
  tm_borders() +
  tm_facets(by = "NAME_1")

在此处输入图像描述

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

library(ggplot2)
library(ggspatial)

ggplot() +
  geom_spatial(FRA) + # FRA is a SpatialPolygonsDataFrame object
  facet_wrap(~NAME_1, scales = "free")

在此处输入图像描述

于 2017-12-06T16:59:52.977 回答