2014-10-24 16 views
5

Sto lavorando con maps e ggplot2 per visualizzare il numero di determinati crimini in ciascuno stato per diversi anni. Il set di dati con cui sto lavorando è stato prodotto dall'FBI e può essere scaricato dal loro sito o dallo here (se non si desidera scaricare il set di dati non ti biasimo, ma è troppo grande per copiare e incollare in questa domanda e includere una frazione del set di dati non sarebbe di aiuto, in quanto non ci sarebbero abbastanza informazioni per ricreare il grafico).Mappe, ggplot2, riempimento per stato mancano alcune aree sulla mappa

Il problema è più semplice di quanto descritto.

Robbery by state

Come si può vedere in California manca un grande pezzo, così come un paio di altri stati. Ecco il codice che ha prodotto questa trama:

# load libraries 
library(maps) 
library(ggplot2) 

# load data 
fbi <- read.csv("http://www.hofroe.net/stat579/crimes-2012.csv") 
fbi <- subset(fbi, state != "United States") 
states <- map_data("state") 

# merge data sets by region 
fbi$region <- tolower(fbi$state) 
fbimap <- merge(fbi, states, by="region") 

# plot robbery numbers by state for year 2012 
fbimap12 <- subset(fbimap, Year == 2012) 
qplot(long, lat, geom="polygon", data=fbimap12, 
    facets=~Year, fill=Robbery, group=group) 

Questo è ciò che i dati states assomiglia:

long  lat  group order region subregion 
1 -87.46201 30.38968  1  1 alabama  <NA> 
2 -87.48493 30.37249  1  2 alabama  <NA> 
3 -87.52503 30.37249  1  3 alabama  <NA> 
4 -87.53076 30.33239  1  4 alabama  <NA> 
5 -87.57087 30.32665  1  5 alabama  <NA> 
6 -87.58806 30.32665  1  6 alabama  <NA> 

E questo è ciò che i dati fbi assomiglia:

Year Population Violent Property Murder Forcible.Rape Robbery 
1 1960 3266740 6097 33823 406   281  898 
2 1961 3302000 5564 32541 427   252  630 
3 1962 3358000 5283 35829 316   218  754 
4 1963 3347000 6115 38521 340   192  828 
5 1964 3407000 7260 46290 316   397  992 
6 1965 3462000 6916 48215 395   367  992 
    Aggravated.Assault Burglary Larceny.Theft Vehicle.Theft abbr state region 
1    4512 11626   19344   2853 AL Alabama alabama 
2    4255 11205   18801   2535 AL Alabama alabama 
3    3995 11722   21306   2801 AL Alabama alabama 
4    4755 12614   22874   3033 AL Alabama alabama 
5    5555 15898   26713   3679 AL Alabama alabama 
6    5162 16398   28115   3702 AL Alabama alabama 

I quindi unì i due set lungo region. Il sottoinsieme che sto cercando di tracciare è

 region Year Robbery  long  lat group 
8283 alabama 2012 5020 -87.46201 30.38968  1 
8284 alabama 2012 5020 -87.48493 30.37249  1 
8285 alabama 2012 5020 -87.95475 30.24644  1 
8286 alabama 2012 5020 -88.00632 30.24071  1 
8287 alabama 2012 5020 -88.01778 30.25217  1 
8288 alabama 2012 5020 -87.52503 30.37249  1 
     ...   ... ...  ... 

Qualche idea su come posso creare questa trama senza quei brutti punti mancanti?

risposta

8

Ho giocato con il tuo codice. Una cosa che posso dire è che quando hai usato merge qualcosa è successo. Ho disegnato la mappa degli stati usando geom_path e confermato che c'erano un paio di linee strane che non esistono nei dati della mappa originale. Ho quindi approfondito questo caso giocando con merge e inner_join. merge e inner_join stanno facendo lo stesso lavoro qui. Tuttavia, ho trovato una differenza. Quando ho usato merge, l'ordine è cambiato; i numeri non erano nella giusta sequenza. Questo non era il caso di inner_join. Di seguito vedrai un po 'di dati con la California. Il tuo approccio era giusto. Ma merge in qualche modo non ha funzionato a tuo favore. Non sono sicuro del perché la funzione abbia cambiato ordine, comunque.

library(dplyr) 

### Call US map polygon 
states <- map_data("state") 

### Get crime data 
fbi <- read.csv("http://www.hofroe.net/stat579/crimes-2012.csv") 
fbi <- subset(fbi, state != "United States") 
fbi$state <- tolower(fbi$state) 


### Check if both files have identical state names: The answer is NO 
### states$region does not have Alaska, Hawaii, and Washington D.C. 
### fbi$state does not have District of Columbia. 

setdiff(fbi$state, states$region) 
#[1] "alaska"   "hawaii"   "washington d. c." 

setdiff(states$region, fbi$state) 
#[1] "district of columbia" 

### Select data for 2012 and choose two columns (i.e., state and Robbery) 
fbi2 <- fbi %>% 
     filter(Year == 2012) %>% 
     select(state, Robbery) 

Ora ho creato due frame di dati con merge e inner_join.

### Create two data frames with merge and inner_join 
ana <- merge(fbi2, states, by.x = "state", by.y = "region") 
bob <- inner_join(fbi2, states, by = c("state" ="region")) 

ana %>% 
    filter(state == "california") %>% 
    slice(1:5) 

#  state Robbery  long  lat group order subregion 
#1 california 56521 -119.8685 38.90956  4 676  <NA> 
#2 california 56521 -119.5706 38.69757  4 677  <NA> 
#3 california 56521 -119.3299 38.53141  4 678  <NA> 
#4 california 56521 -120.0060 42.00927  4 667  <NA> 
#5 california 56521 -120.0060 41.20139  4 668  <NA> 

bob %>% 
    filter(state == "california") %>% 
    slice(1:5) 

#  state Robbery  long  lat group order subregion 
#1 california 56521 -120.0060 42.00927  4 667  <NA> 
#2 california 56521 -120.0060 41.20139  4 668  <NA> 
#3 california 56521 -120.0060 39.70024  4 669  <NA> 
#4 california 56521 -119.9946 39.44241  4 670  <NA> 
#5 california 56521 -120.0060 39.31636  4 671  <NA> 

ggplot(data = bob, aes(x = long, y = lat, fill = Robbery, group = group)) + 
geom_polygon() 

enter image description here

+0

+1 Grazie @jazzurro, funziona alla grande. Qualche idea su cosa '' 'inner_join''' sta facendo diversamente da' '' merge'''? – Ramanudles

+0

@epwalsh Ho rivisto la mia risposta. Dare un'occhiata. 'unire' e' inner_join' fanno lo stesso lavoro. Ma il primo ha incasinato la colonna, ordine. Lo vedrai sopra. – jazzurro

+0

interessante ... Immagino che '' 'inner_join''' sia più robusto. – Ramanudles

1

Il problema è dell'ordine di argomenti per unione

fbimap <- merge(fbi, states, by="region") 

ha i dati tematici primo e il secondo dati geo. Commutare l'ordine con

fbimap <- merge(states, fbi, by="region") 

i poligoni devono essere tutti chiusi.

Problemi correlati