Как объединить шейп-файл с CSV и создать график - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь объединить шейп-файл и файл .csv, чтобы составить карту результатов выборов. Я могу создать график, когда я загружаю шейп-файл, но как только я объединяю его с .csv, он говорит: «Ошибка в plot.window (...): нужны конечные значения xlim».

Я читал в Интернете, и я думаю, что, возможно, мне нужно объединить CSV-файл с шейп-файлом (я объединял шейп-файл с CSV-файлом). Тем не менее, файл CSV (который содержит результаты выборов) имеет больше значений, чем шейп-файл (который дает координаты для районов). Как я могу создать больше округов, чтобы соответствовать результатам выборов? И решит ли это даже мою проблему, или мне чего-то не хватает? Кроме того, данные на испанском языке, но соответствующие значения Distritos = районы, partidos = политическая партия, груз = тип выборов, votos = голоса.

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)

Ссылка на результаты выборов (элект)

Ссылка на шейп-файл (муниципалитет)

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Сначала несколько примеров данных. Это должно быть похоже на то, что вы получаете, когда Вы читаете в своем шейп-файле. 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 перерывов масштаб, и у вас будет больше полигонов, но это только пример. Удачи!

0 голосов
/ 16 января 2019

Вы можете выбрать одну сторону (а затем указать одно значение для административного региона) или фасет стороны (и иметь столько же кратных, сколько и партий).

Это действительно зависит от вашей цели с визуализацией. Принимая во внимание, что в вашем файле, по-видимому, 48 результатов, «маленькие» кратные значения будут довольно большими, и фильтрация имеет больше смысла.

Для объединения шейп-файла и фрейма данных с результатами выборов я предлагаю использовать одну из функций *_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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...