ggplot、ggsave&;coord_map/quickmap:如何保存大型空间对象并获得正确的投影?
我有一个较大的多段线形状文件(巴伐利亚河,可以访问),我想通过ggplot绘制和保存。这可以通过以下代码轻松完成: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
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)