gpt4 book ai didi

r - 使用 R 中的 sf 将美学映射到 LINESTRING 几何图形

转载 作者:行者123 更新时间:2023-12-02 01:07:53 26 4
gpt4 key购买 nike

新式 sf R 包使其非常容易处理
R中的地理数据,以及ggplot2的开发版本有一个新的geom_sf()用于绘制科幻风格地理数据的图层。

sf处理数据的范式,是否可以映射
ggplot 美学到 LINESTRING几何?

例如,使用标准 ggplot,可以重新创建 Minard'sfamous plot of survivors from Napoleon's Grande Armée in1812
使用 ggplot 和 thisdata ,调整路径大小
按幸存者人数划分的军队人数:

# Install the dev version of ggplot2 for geom_sf()
# devtools::install_github("tidyverse/ggplot2")
library(tidyverse)

troops <- read_csv("https://gist.githubusercontent.com/andrewheiss/69b9dffb7cca392eb7f9bdf56789140f/raw/3e2a48635ae44837955765b5e7747c429b0b5d71/troops.csv")

ggplot(troops) +
geom_path(aes(x = long, y = lat, color = direction,
group = group, size = survivors),
lineend = "round")



我们可以将此部队数据用作 sf通过创建新对象 geometry列,像这样:

library(sf)
#> Linking to GEOS 3.6.1, GDAL 2.1.3, proj.4 4.9.3

troops_with_geometry <- troops %>%
st_as_sf(coords = c("long", "lat"))

head(troops_with_geometry)
#> Simple feature collection with 6 features and 3 fields
#> geometry type: POINT
#> dimension: XY
#> bbox: xmin: 24 ymin: 54.5 xmax: 28 ymax: 55
#> epsg (SRID): NA
#> proj4string: NA
#> # A tibble: 6 x 4
#> survivors direction group geometry
#> <int> <chr> <int> <simple_feature>
#> 1 340000 A 1 <POINT (24 54.9)>
#> 2 340000 A 1 <POINT (24.5 55)>
#> 3 340000 A 1 <POINT (25.5 ...>
#> 4 320000 A 1 <POINT (26 54.7)>
#> 5 300000 A 1 <POINT (27 54.8)>
#> 6 280000 A 1 <POINT (28 54.9)>

如果我们用 geom_sf 绘制它, ggplot 将使用点:

ggplot(troops_with_geometry) +
geom_sf(aes(color = direction, group = group))



我们可以通过以下方式为每个组和方向创建线串
分组、总结和类型转换。

troops_lines <- troops_with_geometry %>%
group_by(direction, group) %>%
summarize() %>%
st_cast("LINESTRING")

head(troops_lines)
#> Simple feature collection with 6 features and 2 fields
#> geometry type: LINESTRING
#> dimension: XY
#> bbox: xmin: 24 ymin: 54.1 xmax: 37.7 ymax: 55.8
#> epsg (SRID): NA
#> proj4string: NA
#> direction group geometry
#> 1 A 1 LINESTRING (24 54.9, 24.5 5...
#> 2 A 2 LINESTRING (24 55.1, 24.5 5...
#> 3 A 3 LINESTRING (24 55.2, 24.5 5...
#> 4 R 1 LINESTRING (24.1 54.4, 24.2...
#> 5 R 2 LINESTRING (28.3 54.2, 28.5...
#> 6 R 3 LINESTRING (24.1 54.4, 24.2...

ggplot 然后可以绘制这六条连接线并正确着色它们:

ggplot(troops_lines) +
geom_sf(aes(color = direction, group = group))



然而,幸存者数据现在不见了,无法映射大小
新线条的美学。

有没有办法将其他美学(如尺寸)与 sf 相关联-基于 LINESTRING数据?或者,换句话说,有没有办法重新创建 ggplot(...) + geom_path(aes(x = long, y = lat, size = something))使用 geom_sf()以及处理地理数据的科幻范式?

最佳答案

enter image description here您需要从每个组内的每对点创建一个线串。结果并不那么漂亮,因为我不知道如何给线条圆端点。

# within each group repeat each point 
# then slice the first and last out and
# add a variable called linegroup, which provides grouping for start and endpoints of each line
troops %<>% group_by(group) %>%
slice(rep(1:n(), each = 2)) %>%
slice(-c(1, n())) %>%
mutate(linegroup = lapply(1:(n()/2), function(x) rep(x, 2)) %>% unlist) %>%
ungroup

# create linestring sf object by summarizing the points,
# grab the last survivor and direction value of each group (i.e. the 'endpoint' value)
troops_line <- st_as_sf(troops, coords = c("long", "lat"), crs = 4326) %>%
group_by(group, linegroup) %>%
summarise(survivors = last(survivors), direction = last(direction), do_union = FALSE) %>%
st_cast("LINESTRING")

gp <- ggplot(troops_line) +
geom_sf(aes(color = direction, size = survivors), show.legend = "line")

关于r - 使用 R 中的 sf 将美学映射到 LINESTRING 几何图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46717440/

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