代码之家  ›  专栏  ›  技术社区  ›  M.Teich

ggplot,ggsave&coord廑map/quickmap:如何保存大型空间对象并正确投影?

  •  2
  • M.Teich  · 技术社区  · 8 年前

    我有一个较大的折线形状FabelFiell(巴伐利亚河),可以访问 here )我想通过ggplot来绘制和保存。这可以通过以下代码轻松完成:

    library(ggplot2)
    library(rgdal)
    library(sp)
    library(rgeos)
    
    riv <- readOGR(paste0(getwd(),"\\rivers_bavaria","rivers_bavaria"))
    riv1 <- subset(riv,WDM=="1310"|WDM=="1320")
    riv2 <- subset(riv,WDM=="1330")
    
    p <- ggplot() +
      geom_line(data=riv1, aes(x=long, y=lat, group=group), color="dodgerblue", size=1) +
      geom_line(data=riv2, aes(x=long, y=lat, group=group), color="dodgerblue")
    
    ggsave(paste0(getwd(),"\\riv.tiff",p,device="tiff",units="cm",dpi=300)
    

    这并不完全有效,因为文件太大,但它可以工作。但是,如果不进一步指定纵横比或投影,则输出文件的尺寸由打印窗口定义-这对于地图来说是不可取的。这可以通过使用 coord_quickmap() .

    p1 <- ggplot() +
      geom_line(data=riv1, aes(x=long, y=lat, group=group), color="dodgerblue", size=1) +
      geom_line(data=riv2, aes(x=long, y=lat, group=group), color="dodgerblue") +
      coord_quickmap()
    p1
    

    不幸的是,投影完全关闭了。我试过了 coord_map() 为了得到更好的结果,但是由于文件太大,它需要花费很长时间,因此不是一个现实的选择。通过简化多段线 gLinemerge() 生成一个更小的对象,但不能由ggplot处理,因为它是一个SpatialLines对象。使用 fortify() data.frame() 将其强制为ggplot友好的数据帧格式也会产生 Error: ggplot2 doesn't know how to deal with data of class SpatialLines .

    因此,我正在拼命寻找一个工作流,使我能够绘制和保存这种空间数据在良好的质量与ggplot。任何建议都将不胜感激!

    1 回复  |  直到 8 年前
        1
  •  2
  •   camille    8 年前

    下面是一个快速的 sf 。我推荐 平方英尺 vignette和docs以查看任何函数的更多详细信息。我第一次读到的是 SF 对象使用 sf::st_read ,然后过滤、变异和选择与 dplyr 以获得形状的较小版本。

    library(tidyverse)
    library(sf)
    
    rivers_sf <- st_read("rivers_bavaria/rivers_bavaria.shp") %>%
      filter(WDM %in% c("1310", "1320", "1330")) %>%
      mutate(name2 = ifelse(WDM == "1330", "river 2", "river 1")) %>%
      select(name2, NAM, geometry)
    

    对象相当大,而且绘图非常慢,所以我通过将几何结构按名称结合来简化它,然后使用 st_simplify . 还有 rmapshaper::ms_simplify ,它使用MapShaper,我更喜欢它来更好地控制您保留的信息量。然后为了显示crs转换,我从 Spatial Reference 为了德国。

    riv_simple <- rivers_sf %>%
      group_by(name2, NAM) %>%
      summarise(geometry = st_union(geometry)) %>%
      ungroup() %>%
      st_simplify(preserveTopology = T, dTolerance = 1e6) %>%
      st_transform(31493)
    

    开发版本 ggplot2 在github上有一个函数 geom_sf 用于绘制不同类型的 SF 物体。要获取此版本,请运行 devtools::install_github("tidyverse/ggplot2") .

    吉姆斯夫 有一些怪癖,和其他GEOM有点不同,但是它非常灵活。我相信它会被列入下一个Cran版本。 吉姆斯夫 有相应的 stat_sf coord_sf . 默认情况下,它绘制分划线;若要关闭这些分划线,请添加 coord_sf(ndiscr = F) .

    ggplot(riv_simple) +
      geom_sf(aes(size = name2), color = "dodgerblue", show.legend = "line") +
      scale_size_manual(values = c("river 1" = 1, "river 2" = 0.5)) +
      theme_minimal() +
      coord_sf(ndiscr = F)
    

    enter image description here

    希望能帮助你开始!

    推荐文章