我正在尝试合并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)
答案 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
包您的地图真正地闪闪发亮。
答案 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)
您可以想象自己希望休息3个以上 缩放,您将拥有更多的多边形,但这只是一个示例。祝你好运!