2011-12-16 22 views
8

Vorrei creare una mappa degli Stati Uniti (forse una mappa termica) per mostrare la frequenza di una determinata caratteristica tra gli stati. Non sono sicuro di quale pacchetto utilizzare o se i miei dati sono nella forma corretta. I miei dati sono nella tabella tfCreare una heatmap degli Stati Uniti con abbreviazioni di stato e frequenza caratteristica in R

tf 
AB AK AL AN AR AZ CA CO CT DC DE EN FL GA HI IA ID IL IN KS 
    1 21 31 1 12 56 316 53 31 16 7 1 335 63 11 42 29 73 40 2 

Per la maggior parte, le mie abbreviazioni sono Stati Uniti (a parte alcuni casi canadesi). Qual è l'approccio migliore suggerito per visualizzarlo graficamente su una mappa?

Ora come ottengo granularità inferiore a 50 per colore?

enter image description here

+1

[MapTools] (http://cran.r-project.org/web/packages/maptools /index.html) ('? maptools') e [maps] (http://cran.r-project.org/web/packages/maps/index.html) ('? maps') saranno un buon punto di partenza . Puoi anche trovare utile la [task task spaziale] (http://cran.r-project.org/web/views/Spatial.html). – Seb

+2

possibile duplicato di [Disoccupazione di livello statale in R] (http://stackoverflow.com/questions/5385713/state-level-unemployment-in-r) –

risposta

7

due pacchetti: mappe, ggplot2. C'è un esempio eccellente a:? map_data()

tanto per cominciare:

tf= structure(list(state = structure(1:14, .Label = c("AK", "AL", 
"AR", "AZ", "CA", "CO", "CT", "DE", "FL", "GA", "IA", "IL", "IN", 
"KS"), class = "factor"), num = c(21L, 31L, 12L, 56L, 316L, 53L, 
31L, 7L, 335L, 63L, 42L, 73L, 40L, 2L), region = structure(c(2L, 
1L, 4L, 3L, 5L, 6L, 7L, 8L, 9L, 10L, 13L, 11L, 12L, 14L), .Label = c("alabama", 
"alaska", "arizona", "arkansas", "california", "colorado", "connecticut", 
"delaware", "florida", "georgia", "illinois", "indiana", "iowa", 
"kansas"), class = "factor")), .Names = c("state", "num", "region" 
), class = "data.frame", row.names = c(NA, -14L)) 

require(maps);require(ggplot2) 

states <- map_data("state") 
tfmerged <- merge(states, tf, sort = FALSE, by = "region") 
tfmerged <- tfmerged[order(tfmerged$order), ] 
qplot(long, lat, data = tfmerged, group = group, fill = num, 
geom="polygon") 

Quindi riempire i resti della informazioni stati.

+1

Vorrei semplicemente aggiungere un L ai miei dati numerici allora? – megv

+0

@megv, non è necessario aggiungere un L, ho appena aggiunto quello per mostrare i dati che ho usato. Quello che potrebbe essere necessario aggiungere è il nome degli stati in modo che corrisponda alla regione $ stati in modo che l'unione possa funzionare. – aatrujillob

+0

Dato che ho già una tabella con abbreviazioni di stato e conteggi, posso semplicemente inserirla direttamente nella struttura. Scusa ... sono un po 'nuovo per questo. – megv

7

Un altro approccio con spplot:

library(maps) 
library(maptools) 
library(sp) 

Prima leggere i dati e aggiungere una colonna con i nomi degli stati:

txt <- "AB AK AL AN AR AZ CA CO CT DC DE EN FL GA HI IA ID IL IN KS 
    1 21 31 1 12 56 316 53 31 16 7 1 335 63 11 42 29 73 40 2" 

dat <- stack(read.table(text = txt, header = TRUE)) 
names(dat)[2] <-'state.abb' 
dat$states <- tolower(state.name[match(dat$state.abb, state.abb)]) 

Quindi si ottiene la mappa e convertirlo in un SpatialPolygons:

mapUSA <- map('state', fill = TRUE, plot = FALSE) 
nms <- sapply(strsplit(mapUSA$names, ':'), function(x)x[1]) 
USApolygons <- map2SpatialPolygons(mapUSA, IDs = nms, CRS('+proj=longlat')) 

E ora si aggiungono le informazioni fro m tuoi dati:

idx <- match(unique(nms), dat$states) 
dat2 <- data.frame(value = dat$value[idx], state = unique(nms)) 
row.names(dat2) <- unique(nms) 

USAsp <- SpatialPolygonsDataFrame(USApolygons, data = dat2) 

Infine si tracciarla: Immagine

spplot(USAsp['value']) 

Aggiunto enter image description here

+0

Puoi aggiungere un'immagine del risultato? –

+0

Esiste un metodo per aggiungere Hawaii e Alaska a questa mappa? – marc

+0

Sì, ma devi usare una mappa diversa. Ad esempio, 'mapUSA <- map ('world2', 'USA', fill = TRUE, plot = FALSE)'. –

Problemi correlati