Как объединить шейп-файл с .csv и создать график

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

Я читал в Интернете и думаю, что, возможно, мне нужно объединить CSV-файл с шейп-файлом (я объединял шейп-файл с CSV-файлом). Однако файл csv (который содержит результаты выборов) содержит больше значений, чем шейп-файл (который содержит координаты округов). Как я могу создать больше округов, чтобы соответствовать результатам выборов? И решит ли это мою проблему, или есть что-то еще, чего мне не хватает? Кроме того, данные на испанском языке, но соответствующие значения Distritos=округи, partidos=политическая партия, cargo=тип выборов, 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)

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

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


person Caroline    schedule 16.01.2019    source источник


Ответы (2)


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

person trosendal    schedule 16.01.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, если вы хотите, чтобы ваши карты действительно сияли. .

введите здесь описание изображения

person Jindra Lacko    schedule 16.01.2019