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

Мне удалось подготовить карту переписных участков округа (с указанием всех переписных участков), используя tidycensus и tigris. У меня есть некоторые данные в отдельном фрейме данных с именем demography, который содержит 4 столбца county, tract, x.foreclosure_filing и delinquent_parcels.

Как создать карту только тех участков, которые находятся в кадре данных demography (всего 19 участков), и показать значения x.foreclosure_filing и delinquent_parcels для этих (19) участков на карте?

Демографический кадр данных выглядит следующим образом:

County      tract           X.foreclosure_filings   delinquent_parcels
1 Cuyahoga 1401.00                     8              13.52
2 Cuyahoga 1403.01                    18              22.25
3 Cuyahoga 1403.02                    18              11.96
4 Cuyahoga 1404.00                    19               8.44
5 Cuyahoga 1405.00                    27              10.93
6 Cuyahoga 1407.01                    17              13.77

код

library(tidycensus)
library(tidyverse)
options(tigris_use_cache = TRUE)


clevelandhts <- get_acs(state = "OH", county = "Cuyahoga", geography = "tract", 
                        variables = "B19013_001", geometry = TRUE)

View(clevelandhts)
clevelandhts %>%
  ggplot(aes(fill = estimate)) + 
  geom_sf(color = NA) + 
  coord_sf(crs = 26917) + 
  scale_fill_viridis_c(option = "magma")

person Posh    schedule 28.02.2020    source источник


Ответы (1)


Вы можете использовать fuzzy_join для объединения двух фреймов данных вместе, а str_detect — для поиска строки участка переписи из demography, содержащейся в NAME в clevelandhts. Чтобы включить информацию о различных столбцах карты в виде меток, используйте geom_sf_label.

Изменить: цвет заливки теперь основан на X.foreclosure_filings.

library(tidycensus)
library(tidyverse)
library(fuzzyjoin)

options(tigris_use_cache = TRUE)

demography$tract <- as.character(demography$tract)

census_api_key("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")

clevelandhts <- get_acs(state = "OH", county = "Cuyahoga", geography = "tract", 
                        variables = "B19013_001", geometry = TRUE)

clevelandhts %>%
  fuzzy_join(demography, by = c("NAME" = "tract"), match_fun = str_detect) %>%
  ggplot(aes(fill = X.foreclosure_filings)) + 
  geom_sf(color = NA) + 
  coord_sf(crs = 26917) + 
  scale_fill_viridis_c(option = "magma") +
  geom_sf_label(aes(label = X.foreclosure_filings))

Сюжет

карта с переписными участками

Данные

demography <- read.table(
  text = "County      tract           X.foreclosure_filings   delinquent_parcels
 Cuyahoga 1401.00                     8              13.52
 Cuyahoga 1403.01                    18              22.25
 Cuyahoga 1403.02                    18              11.96
 Cuyahoga 1404.00                    19               8.44
 Cuyahoga 1405.00                    27              10.93
 Cuyahoga 1407.01                    17              13.77", header = T)

Изменить (29.02.20):

Чтобы добавить карту улиц внизу, вы можете сделать следующее.

В этом примере я использую карту улиц Google после ввода ключа API. Аргумент местоположения специфичен для этого примера, но границы блока могут быть получены из clevelandhts после соединения с таблицей demography. Опять же, это всего лишь демонстрация. Если вам нужна дополнительная помощь, я бы посоветовал вам опубликовать отдельный вопрос.

# Requires Google API key
county_map <- get_map(location = c(-81.57,41.49,-81.52,41.56), maptype = "roadmap", source = "google")

full_data <- fuzzy_join(clevelandhts, demography, by = c("NAME" = "tract"), match_fun = str_detect)

ggmap(county_map) +
  geom_sf(data = full_data, inherit.aes = FALSE, aes(fill = X.foreclosure_filings)) + 
  scale_fill_viridis_c(option = "magma", alpha = .2) +
  geom_sf_label(data = full_data, aes(label = X.foreclosure_filings), inherit.aes = FALSE)

карта с видом на улицу

person Ben    schedule 28.02.2020
comment
@Как задать цвет на основе значения {x.foreclosure_filings}, а не переменной {B19013_001}, которая находится во фрейме данных {clevelandhts}? Другими словами, использовать только границы переписного участка из переписи населения США и нанести на карту только мои собственные данные {демография}? - person Posh; 29.02.2020
comment
Цвет, заполняющий участок переписи, был основан на estimate (это то, что было в исходном коде). Вы можете изменить это на другую переменную. Чтобы цвет fill был основан на X.foreclosure_filings, вы можете сделать: ggplot(aes(fill = X.foreclosure_filings)) - person Ben; 29.02.2020
comment
Идеальный. Есть ли способ добавить больше слоев на карту? Мне нужно добавить улицы. А чтобы сделать улицы видимыми, мне придется сделать цвета немного прозрачными. - person Posh; 29.02.2020
comment
@Posh. Чтобы цвет заливки был прозрачным, вы можете добавить alpha, например: scale_fill_viridis_c(option = "magma", alpha = .2). Попробуйте это с вашей текущей картой, чтобы визуализировать, как это выглядит. Что касается улиц, то да, можно добавлять улицы. Возможно, взгляните на этот блог или на этот демо с использованием Openstreetmap или это для руководства по Google Map (ggmap). Возможно, вы захотите задать отдельный вопрос о добавлении карты улиц. - person Ben; 29.02.2020
comment
Я прочитал все ссылки и руководства по добавлению слоя улиц на карту, но так и не смог этого сделать. ggplot() + + geom_sf(data = small_streets$osm_lines, + inherit.aes = FALSE, + color = "black", + size = .4, + alpha = .8) + + coord_sf(xlim = c(-81.52, -81.61), + ylim = c(41.48, 41.55), + expand = FALSE) Это не создает карту улиц для карты, которую мы уже создали (в вашем ответе). - person Posh; 29.02.2020
comment
Я отредактировал ответ, чтобы привести пример просмотра улиц с использованием карты Google (требуется ключ API). Это действительно требует дальнейшей работы, но, надеюсь, этот пример укажет вам направление в будущем. Для получения дополнительной помощи рассмотрите возможность публикации отдельного вопроса по этой теме. Если этот ответ полезен, пожалуйста, проголосуйте или примите ответ. Удачи! - person Ben; 29.02.2020