【发布时间】:2017-10-12 19:27:39
【问题描述】:
用于 R 的新式 sf 包使其非常容易处理
R中的地理数据,ggplot2的开发版本有一个新的
geom_sf() 绘制 sf 风格地理数据的图层。
在使用数据的sf 范式中,是否可以映射
ggplot 美学到LINESTRING 几何?
例如,使用标准 ggplot,可以重新创建 Minard's famous plot of survivors from Napoleon's Grande Armée in 1812 使用 ggplot 和 this data,调整路径大小 军队的幸存者人数:
# 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-based 相关联
LINESTRING 数据?或者,换句话说,有没有办法重新创建
ggplot(...) + geom_path(aes(x = long, y = lat, size = something))
使用geom_sf() 和使用地理数据的 sf 范式?
【问题讨论】:
-
geom_sf似乎只在开发版 ggplot2 (github.com/ropensci/seaaroundus/issues/24) 中可用。在复制之前,我必须从 github (devtools::install_github("tidyverse/ggplot2")) 安装。 -
哦,是的,那个。你需要开发版本:)