将ggplot2 geoms添加到简单的特征图中

时间:2017-07-10 17:40:39

标签: r ggplot2 spatial sf

sf相比,sp包似乎是一种更加用户友好的处理空间数据的方法。例如,如果我有一组纬度/经度坐标,我可以使用ggplot2的开发版本轻松绘制:

library(sf)
devtools::install_github("tidyverse/ggplot2")
library(ggplot2)

# generate some data
set.seed(123)

y = rnorm(10, mean=40, sd=20)
x = rnorm(10, mean=-100, sd=30)

# collect to data.frame
xy = data.frame(x=x,y=y)

# create sf object
xy.sf = sf::st_as_sf(xy, coords=c("x", "y"), crs=4269)

# plot points
ggplot(data=xy.sf) + geom_sf()

ggplot2::geom_sf函数知道xy.sf对象的几何是一组点,因此我不需要调用,例如ggplot2::geom_point()

但是,假设我想根据点集添加另一个geom。

例如,如果我想生成轮廓图层来显示点集中的位置,我会按照this answerthis answer中的建议使用ggplot2::geom_density2dggplot2::stat_density2d

但是,以下代码

ggplot(data=xy.sf) +
    geom_sf() +
    geom_density2d(data=xy.sf, aes(x=x,y=y,colour=..level..))

生成以下图像

test countour map

请注意,countour线似乎有相反的坐标!

我试着摆弄上面的代码,但无法让它发挥作用。我意识到sf包是相当新的,但地图非常接近正确!有什么想法吗?

修改:忘记添加会话信息

> sessionInfo()
R version 3.4.0 (2017-04-21)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

Matrix products: default

locale:
[1] LC_COLLATE=English_United States.1252 
[2] LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] ggplot2_2.2.1.9000 sf_0.4-3          

loaded via a namespace (and not attached):
 [1] Rcpp_0.12.9       magrittr_1.5      maps_3.1.1        units_0.4-4      
 [5] MASS_7.3-47       munsell_0.4.3     geosphere_1.5-5   colorspace_1.3-2 
[9] lattice_0.20-35   rjson_0.2.15      jpeg_0.1-8        rlang_0.1.1      
[13] stringr_1.2.0     udunits2_0.13     plyr_1.8.4        tools_3.4.0      
[17] rgdal_1.2-5       grid_3.4.0        gtable_0.2.0      png_0.1-7        
[21] DBI_0.5-1         ggthemes_3.3.0    lazyeval_0.2.0    assertthat_0.1   
[25] digest_0.6.12     tibble_1.3.1      ggmap_2.6.1       reshape2_1.4.2   
[29] mapproj_1.2-4     labeling_0.3      sp_1.2-4          stringi_1.1.2    
[33] compiler_3.4.0    RgoogleMaps_1.4.1 scales_0.4.1      proto_1.0.0

1 个答案:

答案 0 :(得分:2)

为了将来参考,我想我会将我的发现作为答案发布:

事实证明,在geom_sf之后添加图层(例如geom_density2d)并不会继承应用于geom_sf的贴图美学。

请注意,这可以按预期工作:

ggplot(data=xy.sf, aes(x=x, y=y)) +
    geom_sf() +
    geom_density2d(aes(colour=..level..))

但仅仅因为x,y作为对象与<{1}}分开而存在。

因此,以下引发错误:

xy.sf
  

FUN中的错误(X [[i]],...):找不到对象'x'

当然,这可以在documentation

中找到
  

rm(x,y) ggplot(data=xy.sf, aes(x=x, y=y)) + geom_sf() + geom_density2d(aes(colour=..level..)) 使用独特的美学:geom_sf ...与其他美学不同,geometry永远不会从情节中继承。”

所以我找到的解决方法是使用geometry个对象本身,或x,ydata.frame个对象的纯sf版本;例如,geom_density2d(data=xy, aes(x,y,colour=..level..))