gpt4 book ai didi

r - 具有相同空间尺度的带有 geom_sf 的小型多张 map

转载 作者:行者123 更新时间:2023-12-04 09:31:51 29 4
gpt4 key购买 nike

我想使用 ggplot2::geom_sf 绘制带有多个小 map 的图形.这里的挑战是如何做到这一点,使所有 map 都在图像中居中并处于相同的空间尺度。这是问题(以下可重现示例的数据):

使用 facet_wrap 的简单 map 将所有多边形放在相同的空间尺度上,但它们不居中。

ggplot(states6) +
geom_sf() +
facet_wrap(~name_state)

enter image description here

这是来自此 SO question 的解决方案
使用 cowplot .在这种情况下,多边形居中,但它们处于不同的空间尺度
g <- purrr::map(unique(states6$name_state),
function(x) {

# subset data
temp_sf <- subset(states6, name_state == x)

ggplot() +
geom_sf(data = temp_sf, fill='black') +
guides(fill = FALSE) +
ggtitle(x) +
ggsn::scalebar(temp_sf, dist = 100, st.size=2,
height=0.01, model = 'WGS84',
transform = T, dist_unit='km')
})

g2 <- cowplot::plot_grid(plotlist = g)
g2

enter image description here

我使用 tmap 发现了同样的问题图书馆。
 tm_shape(states6) +
tm_borders(col='black') +
tm_fill(col='black') +
tm_facets(by = "name_state ", ncol=3) +
tm_scale_bar(breaks = c(0, 50, 100), text.size = 3)

期望输出

我想得到的输出类似于以下内容:

enter image description here

可重现示例的数据
library(sf)
library(geobr)
library(mapview)
library(ggplot2)
library(ggsn)
library(cowplot)
library(purrr)
library(tmap)

# Read all Brazilian states
states <- geobr::read_state(code_state = 'all', year=2015)

# Select six states
states6 <- subset(states, code_state %in% c(35,33,53,29,31,23))

最佳答案

这并不理想,但您可以使用相同的框大小以编程方式制作多个图,然后使用::gridExtra 将它们放在一起。要获得每个框的中心,请使用每个几何体的质心。

library(sf)
library(geobr)
library(mapview)
library(ggplot2)
library(gridExtra)

阅读巴西所有州:
states <- geobr::read_state(code_state = 'all', year=2015)

选择六个州:
states6 <- subset(states, code_state %in% c(35,33,53,29,31,23))

质心,供在 ggplot bellow 中引用(我必须设置投影,如果需要,请在此处进行更改):
states6$centroid <- 
sf::st_transform(states6, 29101) %>%
sf::st_centroid() %>%
sf::st_transform(., '+proj=longlat +ellps=GRS80 +no_defs') %>%
sf::st_geometry()

设置填充:
padding <-7 

绘图功能:
graph <- function(x){
ggplot2::ggplot(states6[x,]) +
geom_sf() +
coord_sf(xlim = c(states6$centroid[[x]][1]-padding ,
states6$centroid[[x]][1]+padding),
ylim = c(states6$centroid[[x]][2]-padding ,
states6$centroid[[x]][2]+padding),
expand = FALSE)
}

创建一堆图:
plot_list <- lapply(X = 1:nrow(states6), FUN = graph)

把它们放在一起:
g <- cowplot::plot_grid(plotlist = plot_list, ncol = 3)
g

results

关于r - 具有相同空间尺度的带有 geom_sf 的小型多张 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58549852/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com