2016-07-17 4 views
3

У меня есть некоторые демографические данные, которые я хотел бы использовать, чтобы сделать choropleth карту графств США. Мой рабочий процесс не попадает в какие-либо ошибки, и я могу создать окончательную карту, однако, данные, что ее отображение неверно. В моем рабочем процессе используются два источника данных - файл формы и data.frame. Шейпфайлом является графства шейпфайла, которые можно найти по этой ссылке https://www.dropbox.com/s/4ujxidyx42793j7/cb_2015_us_county_500k.zip?dl=1 data.frame файла можно найти по этой ссылке: https://www.dropbox.com/s/qys6s6ikrs1g2xb/data.dem.csv?dl=1Невозможно построить карту choropleth в r

Вот мой код:

#Load dependencies 
library(sp) 
library(spatialEco) 
library(rgdal) 
library(dplyr) 
library(maptools) 
library(taRifx.geo) 
library(ggplot2) 
library(USAboundaries) 
library(splitstackshape) 
library(maps) 
library(cowplot) 

#Read in shape and csv files 
county.track<-readOGR("/path", "filename") 
[email protected]$id = rownames([email protected]) 
data<-read.csv("/path/filename.csv") 

#Convert data.frame (data) to points polygon file 
data$y<-data$lat 
data$x<-data$long 
coordinates(data) <- ~ x + y 
proj4string(data) <- CRS("+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0") 
proj4string(county.track) <- CRS("+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0") 

#Overlay points onto polygons 
county.track.data<-point.in.poly(data, county.track) 

#Summarize point data by county 
count<-select(as.data.frame(county.track.data), id, count) 
count<-count %>% 
    group_by(id) %>% 
    summarize(count=sum(count)) 

#Merge with shape file data 
[email protected]<-merge([email protected], count, by="id", all.x=T) 

#Replace NA values with zeroes 
[email protected]$count[is.na([email protected]$count)]<-0 
county.track.points = fortify(county.track, region="id") 
map.plot<-merge(county.track.points, [email protected], by="id") 

#Get rid of Hawaii and Alaska 
map.plot<-map.plot %>% 
    filter(lat<50 & lat>25) %>% 
    filter(long>-130) 

#Create choropleth map using ggplot2 
ggplot(map.plot) + 
    geom_polygon(aes(long, lat, group=group, fill=log(count))) + 
    coord_map() 

выход выглядит следующим образом : enter image description here

Но это просто неправильно, что очевидно по ряду причин. Один, наиболее очевидно, что большая часть данных не отображается. Серые области на карте обозначают NA. Но я удалил NA в одном из шагов выше, также при анализе данных, используемых для сопоставления (map.plot), в переменной заполнения (счет) нет NA. Во-вторых, распределение значений для того, что отображается, отключено. Граф Лос-Анджелеса должен иметь наивысшее значение счета в 793 (значение журнала 6,675823), но на карте многочисленные светлые графства указывают, что значение других пространственных единиц выше, а некоторые из ранжированных графств, таких как Сан-Диего, не заполняются вообще (внизу слева от карты).

Когда я просматриваю данные, которые я использовал для сопоставления (map.plot), все кажется ОК. Область Лос-Анджелеса по-прежнему является наивысшей оценкой графства для переменной «count», но карта предполагает иное (см. Здесь изображение). enter image description here Я надеюсь, что кто-то может сделать некоторые судебные экспертизы здесь и определить проблему, я сделал все возможное, чтобы пройти все мои шаги, но я не могу показать, что это проблема. Заранее спасибо.

UPDATE: Я попытался использовать другой файл формы из того же источника. Файл формы в приведенной выше ссылке аналогичен файлу с надписью «cb_2015_us_county_500k.zip» следующим образом (https://www.census.gov/geo/maps-data/data/cbf/cbf_counties.html). Когда я выбираю другой шейп (например, cb_2015_us_county_5m.zip) Я получаю другую карту, но одни и те же проблемы: Смотрите следующую карту пример:

enter image description here

я не уверен, что происходит! На этой новой карте графство Лос-Анджелеса больше не окрашено, а Orange County! Буду признателен за любую оказанную помощь.

ответ

3

Не Rly уверен, что происходит с вашим сращиванием, но это работает для меня:

library(albersusa) # devtools::install_github("hrbrmstr/albersusa) 
library(readr) 
library(dplyr) 
library(rgeos) 
library(maptools) 
library(ggplot2) 
library(ggalt) 
library(ggthemes) 
library(viridis) 

df <- read_csv("data.dem.csv") 

counties_composite() %>% 
    subset(state %in% unique(df$state)) -> usa 

pts <- df[,2:1] 
coordinates(pts) <- ~long+lat 
proj4string(pts) <- CRS(proj4string(usa)) 

bind_cols(df, select(over(pts, usa), -state)) %>% 
    count(fips, wt=count) -> df 

У вас есть 942 всего графства:

glimpse(df) 
## Observations: 942 
## Variables: 2 
## $ fips <chr> "01001", "01003", "01013", "01015", "01043", "01055", "01061", ... 
## $ n <int> 1, 2, 1, 3, 1, 3, 1, 1, 19, 6, 12, 7, 7, 1, 4, 4, 1, 5, 67, 19,... 

Есть более 3K округов в США

Однако, существует не так много NA s:

filter(df, is.na(fips)) 
## # A tibble: 1 x 2 
## fips  n 
#3 <chr> <int> 
## 1 <NA> 10 

usa_map <- fortify(usa, region="fips") 

gg <- ggplot() 
gg <- gg + geom_map(data=usa_map, map=usa_map, 
        aes(long, lat, map_id=id), 
        color="#b2b2b2", size=0.05, fill="white") 
gg <- gg + geom_map(data=df, map=usa_map, 
        aes(fill=n, map_id=fips), 
        color="#b2b2b2", size=0.05) 
gg <- gg + scale_fill_viridis(name="Count", trans="log10") 
gg <- gg + coord_proj(us_aeqd_proj) 
gg <- gg + theme_map() 
gg <- gg + theme(legend.position=c(0.85, 0.2)) 
gg 

enter image description here

+0

Спасибо за ответ, у меня возникают проблемы тиражирования код '' counties_composite()%>% подмножества (состояние % in% unique (df $ state)) -> usa'' Я получаю следующую ошибку: Ошибка в матче (x, table, nomatch = 0L): object 'state' not found –

+0

, когда я запускаю это вместо '' counties_composite()%>% subset (df $ state% in% unique (df $ state)) -> usa'' , то эта строка дает мне ошибку: координаты (pts) <- ~ long + lat Ошибка в (function (classes, fdef, mtable): не удается найти унаследованный метод для функций 'координат <-' для подписи '" tbl_df "' –

+0

Получил это' 'pts <-as.data.frame (его)' ' –

Смежные вопросы