2017-10-12 41 views
3

新十歲上下sf包的R使得它很容易處理R中 地理數據,並ggplot2的發展探析版本有一個新的 geom_sf()層密謀SF風格的地理數據。地圖美學中的R與SF LINESTRING幾何

sf模式處理數據的,是有可能 ggplot aestheics映射到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") 

我們可以工作通過創建新的 geometry列將此部隊數據作爲sf對象,如下所示:

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數據?或換句話說,有沒有辦法用geom_sf()和使用地理數據的SF範式來重新創建 ggplot(...) + geom_path(aes(x = long, y = lat, size = something))

+1

'geom_sf'似乎只在ggplot2的開發版本中可用(https://github.com/ropensci/seaaroundus/issues/24)。我必須從github('devtools :: install_github(「tidyverse/ggplot2」)')進行安裝才能複製。 – mkearney

+0

哦,是的。你需要開發版本:) – Andrew

回答

0

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")