R map mit ggplot2 - Ошибка: эстетика должна иметь длину 1 или совпадать с данными - PullRequest
0 голосов
/ 05 ноября 2018

Я хочу создать карту и раскрасить регионы почтового индекса соотношением на почтовый индекс.

Возможно, вам не нужны данные, но файлы форм можно найти здесь (16 МБ) https://www.suche -postleitzahl.org / download_v1 / wgs84 / mittel / plz-5stellig / shapefile / plz-5stellig.shp .zip

И если есть проблема с несовпадающими почтовыми индексами из случайно сгенерированных, вот реальные (1 МБ) https://www.suche -postleitzahl.org / download_files / public / zuordnung_plz_ort.csv

library(tidyverse)
set.seed(1) ##I set a seed, just to ensure reproducibility
zip <- sample(100:201, 5000, replace = TRUE)
outcome <- rbinom(5000, 1, 0.23)
df <- data.frame(id, outcome, zip) %>% as_tibble()
new_df <- df %>% group_by(zip) %>% summarise(ratio = mean(outcome))

library(ggplot2)
library(maptools)
library(rgdal)
library(ggthemes)

setwd("path")

shape <- readOGR(dsn = ".", layer = "plz-5stellig")
shape_df <- fortify(shape, note="Berlin")

gg <- ggplot()
gg <- gg + geom_map(data=new_df, map=shape_df,
                    aes(fill=outcome, map_id=zip),
                    color="#7f7f7f", size=0.25)
gg

Что, к сожалению, дает мне:

Ошибка: эстетика должна иметь длину 1 или совпадать с данными (102): заполните, map_id

В чем здесь проблема? Как я могу сопоставить эстетику с почтовым индексом?

Моя цель - создать карту вроде https://blog.eoda.de/wp-content/uploads/2014/12/Kartenvisualisierung-mit-R-Haushaltsverteilung-in-Kassel.png

1 Ответ

0 голосов
/ 05 ноября 2018

Группируя и суммируя данные, вы получаете менее 5000 строк, потому что ваш вызов sample позволяет отрисовывать почтовые индексы более одного раза. Дублированные почтовые индексы затем сжимаются в одно значение на group_by + summarise. Ваш фрейм данных new_df теперь имеет 102 строки, и если вы хотите построить его, каждая определенная эстетика должна иметь длину 1 или 102 (количество строк в вашем фрейме данных). Вместо этого вы пытаетесь ввести векторы длиной 5000 (те, которые вы инициализировали в начале).

Что вам нужно сделать, это обновить переменные zip и outcome после того, как вы сократили свой фрейм данных:

library(tidyverse)
set.seed(1) ##I set a seed, just to ensure reproducibility
zip <- sample(100:201, 5000, replace = TRUE)
outcome <- rbinom(5000, 1, 0.23)
df <- data.frame(id, outcome, zip) %>% as_tibble()
new_df <- df %>% group_by(zip) %>% summarise(ratio = mean(outcome))
zip <- new_df %>% pull(zip) # only get the zips in your sample
outcome <- new_df %>% pull(outcome) # only get the outcomes in your sample

library(ggplot2)
library(maptools)
library(rgdal)
library(ggthemes)

setwd("path")

shape <- readOGR(dsn = ".", layer = "plz-5stellig")
shape_df <- fortify(zips, note="Berlin")

gg <- ggplot()
gg <- gg + geom_map(data=new_df, map=shape_df,
                    aes(fill=outcome, map_id=zip),
                    color="#7f7f7f", size=0.25)
gg
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...