ggplot、ggsave&;coord_map/quickmap:如何保存大型空间对象并获得正确的投影?

ggplot、ggsave&;coord_map/quickmap:如何保存大型空间对象并获得正确的投影?,r,plot,ggplot2,gis,sp,R,Plot,Ggplot2,Gis,Sp,我有一个较大的多段线形状文件(巴伐利亚河,可以访问),我想通过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 <- sub

我有一个较大的多段线形状文件(巴伐利亚河,可以访问),我想通过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_map()
,但由于文件太大,需要花费很长时间,因此这不是一个现实的选择。通过
gLinemerge()
简化多段线会生成一个小得多的对象,但不能由ggplot处理,因为它是一个SpatialLines对象。使用
fortify()
data.frame()


因此,我正在拼命寻找一个工作流程,它允许我用ggplot以高质量绘制和保存此类空间数据。任何建议都将不胜感激

下面是使用
sf
的快速演练。我建议通过
sf
vignettes和docs查看任何功能的更多详细信息。我首先使用
sf::st_read
将shapefile作为
sf
对象读取,然后过滤、变异,并选择与
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)
GitHub上的开发版本的
ggplot2
具有绘制不同类型的
sf
对象的功能。要获得此版本,请运行
devtools::install\u github(“tidyverse/ggplot2”)

geom_sf
有一些怪癖,工作原理与其他geom稍有不同,但它的功能相当广泛。我相信它将包含在下一个CRAN版本中
geom\U sf
具有相应的
stat\U sf
coord\U sf
。默认情况下,它绘制分划线;要关闭这些功能,请添加
coord\u sf(ndiscr=F)


希望这能帮助你开始

您介意一个
sf
解决方案吗?它使你所做的子集设置,改变投影,在ggplot中绘图非常简单和直接是的,请-否则我以前所有的工作都将白费!非常感谢你的工作!我非常喜欢sf对象的简单表格格式。不幸的是,我无法安装ggplot的开发版本(遵循建议)。没有其他方法可以简化大型空间对象,以便使用ggplot进行打印吗?该帖子已经过时;我要修改我的答案。
tidyverse
repo现在位于“tidyverse/ggplot2”(或填写生态系统中的任何其他包名),而不是“hadley/ggplot2”
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)
riv_simple <- rivers_sf %>%
  group_by(name2, NAM) %>%
  summarise(geometry = st_union(geometry)) %>%
  ungroup() %>%
  st_simplify(preserveTopology = T, dTolerance = 1e6) %>%
  st_transform(31493)
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)