r - 使用 facet wrap 和 scales free 用 geom_sf 映射不同的状态

标签 r ggplot2 sf

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

Erreur : Free scales are only supported with coord_cartesian() and coord_flip()



有没有我错过的选项?
任何人都解决了问题而不会被迫使用cowplot (或任何其他网格排列)?

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

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

比例尺是根据整个 map 的范围计算的。
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)

facet regions with geom_sf

使用牛图的结果

我需要使用 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)

facet regions with geom_sf and cowplot

最佳答案

我知道您正在寻找使用 ggplot2 的解决方案,但我找到了 tmap包可能是一个选择取决于您的需要。 tmap 的语法类似于 ggplot2 ,也可以带sf目的。带上您的 FRA_sf例如,我们可以做这样的事情。

library(tmap)

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

enter image description here

或者我们可以使用 geom_spatial来自 ggspatial包,但 geom_spatial只需要Spatial*目的。
library(ggplot2)
library(ggspatial)

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

enter image description here

关于r - 使用 facet wrap 和 scales free 用 geom_sf 映射不同的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47678480/

相关文章:

R Shiny : create non-reactive background in plotOutput

r - 如何在 ggplot 中绘制 y 值向量?

json - R、GeoJSON 和传单

r - 使用 geom_sf() 绘制世界地图时缺少轴刻度和标签

r - 嵌套 'ifelse' 语句返回此错误 : 'mult argument can only be ' first' ,'last' or 'all' '

r - 如何反转ggplot2中y轴值的顺序

r - 如何更改 ggplot2 中的默认主题?

r - 在 map 中绘制点(经度和纬度)ggplot2

r - 将 GeoJSON 转换为 R 中的简单特征

r - 条形图 (ggplot2) 中的单个条形图错位