如何将shapefile与.csv合并并创建图形

时间:2019-01-16 12:47:56

标签: r dplyr shapefile sf maptools

我正在尝试合并shapefile和.csv文件以制作选举结果图。加载shapefile时,我可以制作一个图形,但是一旦将其与.csv合并,它就会显示“ plot.window(...)中的错误:需要有限的'xlim'值”。

我一直在网上阅读,我想也许我必须将csv文件合并到shapefile(我一直在将shapefile合并到csv文件)。但是,csv文件(包含选举结果)具有比shapefile(用于提供地区坐标)的值更多。如何建立更多地区以匹配选举结果?这是否可以解决我的问题,还是我还缺少其他东西?此外,数据为西班牙语,但相关值包括Distritos = districts,partidos = policy party,cargo =选举类型,votos = votes。

library(maptools)
library(rgdal)
library(rgeos)
library(sf)

municipios <-readOGR("/Users/Desktop/Limite_partidos/Shapefile/Partidos.shp")

elec <- read.csv("/Users/Desktop/elections excel.csv", header = TRUE, stringsAsFactors = FALSE)


library(dplyr)
#merge datasets together
elec <-merge(elec, municipios, by=c("nam"), na.rm=TRUE)


plot(elec)

Link to election results (elec)

Link for shapefile (municipios)

2 个答案:

答案 0 :(得分:0)

您可以选择一个政党(然后在每个管理区域具有一个单一值),也可以选择该政党的方面(并具有与政党一样多的小倍数)。

这实际上取决于可视化的目标。假设您的文件中似乎有48个结果,则“小”倍数会很大,而过滤更有意义。

为了将shapefile和数据框与选举结果结合在一起,我建议使用*_join包中的tidyverse函数之一。

考虑这种基于过滤假设的方法:

library(tidyverse)
library(sf)

tf_elec <- tempfile(fileext = ".csv") # create a temporary csv file
download.file("https://catalogo.datos.gba.gob.ar/dataset/1ae289f8-532c-4f69-a3c8-0268fe0ee390/resource/f8168491-4c38-4b03-82f1-b05fe43f8349/download/generales-2017.csv", tf_elec, quiet = T) 
elec <- read_csv2(tf_elec) # read the data

tf_zip <- tempfile(fileext = ".zip") # a temoprary zip file
download.file("https://catalogo.datos.gba.gob.ar/dataset/627f65de-2510-4bf4-976b-16035828b5ae/resource/de607a34-b782-420f-93ed-35073a016e01/download/limite_partidos.zip", tf_zip, quiet = T)
unzip(tf_zip, files = 'Limite_partidos/GeoJSON/Partidos.geojson', exdir = tempdir(), junkpaths = T)
municipios <- st_read(paste0(tempdir(), '/Partidos.geojson'), quiet = T) # read the metro stations

src <- municipios %>%
  left_join(elec, by = c('nam' = 'distrito')) %>%
  filter(partido == 'VOTOS NULOS') #or what not... :)

ggplot() +
  geom_sf(data = src, aes(fill = votos)) 

最困难的部分是下载数据。 left_join()位于倒数第二个块中,最后一个是可视化-为简单起见,我采取了简单的ggplot2路线,但如果需要,还考虑使用出色的tmap包您的地图真正地闪闪发亮。

enter image description here

答案 1 :(得分:0)

首先提供一些样本数据。这应该类似于您在什么时候得到的 您在shapefile中读取了。 R空间对象称为 SpatialPolygonsDataFrame。它带有一个data.frame和协变量 有关多边形的信息。

library(sp)
Sr1  <-  Polygon(cbind(c(2,4,4,1,2),c(2,3,5,4,2)))
Sr2  <-  Polygon(cbind(c(5,4,2,5),c(2,3,2,2)))
Sr3  <-  Polygon(cbind(c(4,4,5,10,4),c(5,3,2,5,5)))
Sr4  <-  Polygon(cbind(c(5,6,6,5,5),c(4,4,3,3,4)), hole = TRUE)
Srs1  <-  Polygons(list(Sr1), "s1")
Srs2  <-  Polygons(list(Sr2), "s2")
Srs3  <-  Polygons(list(Sr3, Sr4), "s3/4")
SpP  <-  SpatialPolygons(list(Srs1,Srs2,Srs3), 1:3)
Spdf <- SpatialPolygonsDataFrame(SpP, data.frame(name = c("a", "b", "c"), row.names = c("s1", "s2", "s3/4")))

现在您可以绘制一个空间对象:

plot(Spdf)

,然后查看您的空间对象所附的data.frame。在这里,您需要具有一些将与您的选举结果匹配的标识符:

Spdf@data

您还有一个带有“选举结果”的数据框(也带有此标识符)

election <- data.frame(name = c("a", "c", "b"), voted = c(0.1, 0.2, 0.3))

现在将选举结果与您的空间对象匹配,以便对其进行绘制:

Spdf@data$voted <- election$voted[match(Spdf$name, election$name)]

要绘制具有投票结果作为多边形颜色的多边形,您需要使用调色板:

Spdf@data$colour <- heat.colors(3)[as.numeric(cut(Spdf@data$voted, 3))]

然后只是绘图:

plot(Spdf, col = Spdf@data$colour)

enter image description here

您可以想象自己希望休息3个以上 缩放,您将拥有更多的多边形,但这只是一个示例。祝你好运!