将形状文件导入R的多个多边形实例-如何删除或简化多个多边形?

时间:2019-04-28 20:33:36

标签: r ggplot2

我想在R中绘制一个shapefile。这是一张瑞士地图,并且我想给州加上标签和颜色(如州)。我想用ggplot2绘图。但是,当我导入时,最终得到许多多边形,而我只真正想要26个多边形(好吧,它们的边界在某些地方是奇数)。但是,最终我得到了超过13,000个多边形。当我给它们添加标签时,我只需要26个标签就得到13,000个标签。如何简化多边形和标签?

这是我的代码。

谢谢

library(ggplot2)
library(maptools)


require(rgdal)
require(ggplot2)
require(maptools)

cantons <- readOGR("Kantone.shp", stringsAsFactors = F)

cantons@data$id <- rownames(cantons@data)
cantons@data   <- join(cantons@data, data, by="Name")
cantonsdf     <- fortify(cantons)
cantonsdf     <- join(cantonsdf,cantons@data, by="id")

cantonmap <- ggplot(cantonsdf, aes(long, lat)) +
  geom_polygon(aes(group = group), colour = "grey50", fill = NA) + coord_quickmap()

cantonmap + theme_void() + geom_text(aes(x = long, y = lat, label = cantonsdf$Name))```

1 个答案:

答案 0 :(得分:0)

一个数据示例可能会有所帮助,但这是一种使用sf包和应该有效的tidyverse聚合面和标签的方法:

library(tidyverse)
library(sf)

cantons <- st_read('Kantone.shp')

cantons %>%
  group_by(Name) %>%
  summarise_all(mean) %>%
  ggplot() +
    geom_sf() +
    geom_sf_label(aes(label = Name))

summarise_all与基础dplyr函数的aggregate等价。在这种情况下它起作用是因为,当您对sf对象的数据部分执行聚合时,它会根据group_by参数将所有几何形状合并为一个多面体,但不会执行mean对几何函数起作用,对其余数据起作用。在该聚合的多边形内重叠或接触的任何多边形会自动消除其内部边界。您可以通过以下方法进行检查:

geom_agg <- cantons %>%
  dplyr::select(Name) %>% 
  group_by(Name) %>% 
  summarise_all(mean)

aggregate(cantons, 
          list(cantons$Name), 
          FUN = mean
          do_union = TRUE)$geometry[[1]] == geom_agg$geometry[[1]]

除非输入错误,否则应该以{{1​​}}的形式出现。

如果标签重叠,则增加地图大小应该可以解决该问题。我将图形的高度和宽度分别更改为7.5英寸和10.5英寸,以水平放置在一张A4纸上,效果很好。