2016-07-17 8 views
3

Ich habe einige demographische Daten, die ich verwenden möchte, um eine Choropleth-Karte von US-Grafschaften zu machen. Mein Workflow führt zu keinen Fehlern und ich kann die endgültige Karte erstellen, jedoch die Daten, deren Zuordnung falsch ist. Mein Workflow verwendet zwei Datenquellen - eine Formdatei und ein data.frame. Die Shape-Datei ist ein Grafschaft Shape-Datei, die Sie unter diesem Link zu diesem Link https://www.dropbox.com/s/4ujxidyx42793j7/cb_2015_us_county_500k.zip?dl=1 Die data.frame Datei gefunden werden kann hier gefunden werden kann: https://www.dropbox.com/s/qys6s6ikrs1g2xb/data.dem.csv?dl=1Konnte keine choropleth map in r

Hier ist mein Code:

#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() 

Die Ausgabe sieht wie folgt aus : enter image description here

Aber das ist einfach falsch, was aus einer Reihe von Gründen offensichtlich ist. Einer, am offensichtlichsten ist ein Großteil der Daten nicht abgebildet. Die grauen Bereiche auf der Karte bedeuten NA. Aber ich habe die NAs in einem der obigen Schritte entfernt. Auch bei der Untersuchung der Daten, die zum Mapping (map.plot) verwendet wurden, gibt es keine NAs in der Füllvariablen (count). Zweitens ist die Verteilung von Werten für das, was zugeordnet ist, deaktiviert. Los Angeles County sollte den höchsten Zählwert bei 793 haben (logarithmischer Wert von 6,675823), doch auf der Karte zeigen zahlreiche hellere Grafschaften an, dass der Wert anderer räumlicher Einheiten höher ist und einige der topbewerteten Bezirke wie San Diego nicht gefüllt sind überhaupt (unten links auf der Karte).

Wenn ich die Daten untersuche, die ich verwendet habe (map.plot), scheint alles OK zu sein. Los Angeles County ist immer noch die am höchsten bewertete Grafschaft für die "Zählung" Variable, doch die Karte schlägt anders vor (sieh dieses Bild hier). enter image description here Ich hoffe, jemand kann hier eine Spurensicherung machen und das Problem identifizieren, ich habe mein Bestes getan, um alle meine Schritte durchzugehen, aber ich kann das Problem nicht identifizieren. Danke im Voraus.

UPDATE: Ich habe versucht, ein anderes Shapefile aus der gleichen Quelle zu verwenden. Das Shapefile im obigen Link ist dasselbe wie das mit "cb_2015_us_county_500k.zip" (https://www.census.gov/geo/maps-data/data/cbf/cbf_counties.html). Wenn ich eine andere Shape-Datei (wie cb_2015_us_county_5m.zip) wählen erhalte ich eine andere Karte, aber dieselben Probleme: Siehe die folgenden ein Beispiel Karte:

enter image description here

Ich bin nicht sicher, was los ist! In dieser neuen Karte ist LA County nicht mehr einmal in Orange County gefärbt! Jede Hilfe wird sehr geschätzt.

Antwort

3

Nicht sicher RLY, was mit Ihrer Verschmelzung ist los, aber das war für mich:

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 

Sie haben 942 insgesamt Grafschaften:

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,... 

Es gibt mehr als 3K Landkreise in den USA

Allerdings gibt es nicht viele 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

Vielen Dank für die Antwort, ich habe Probleme Code zu replizieren '' counties_composite()%>% Teilmenge (Zustand % in% unique (df $ state)) -> usa'' Ich bekomme folgenden Fehler: Fehler in Übereinstimmung (x, Tabelle, nomatch = 0L): Objekt 'state' nicht gefunden –

+0

wenn ich dies stattdessen "counties_composite."()%>% Teilmenge (df $ state% in% eindeutig (df $ state)) -> usa'' dann gibt mir diese Zeile einen Fehler: Koordinaten (Punkte) <- ~ lang + lat Fehler in (Funktion (Klassen, fdef, Mtabelle): nicht finden eine geerbte Methode für die Funktion 'Koordinaten <-' für die Signatur '" tbl_df "' –

+0

Es geht mit' 'pts <-as.data.frame (it)' ' –