2012-03-04 7 views
21

Voglio tracciare una mappa del mondo usando ggplot2 (v.9) che combina due pezzi se informazione. Il seguente esempio illustra:ggplot map con l

library(rgdal) 
library(ggplot2) 
library(maptools) 

# Data from http://thematicmapping.org/downloads/world_borders.php. 
# Direct link: http://thematicmapping.org/downloads/TM_WORLD_BORDERS_SIMPL-0.3.zip 
# Unpack and put the files in a dir 'data' 

gpclibPermit() 
world.map <- readOGR(dsn="data", layer="TM_WORLD_BORDERS_SIMPL-0.3") 
world.ggmap <- fortify(world.map, region = "NAME") 

n <- length(unique(world.ggmap$id)) 
df <- data.frame(id = unique(world.ggmap$id), 
       growth = 4*runif(n), 
       category = factor(sample(1:5, n, replace=T))) 

## noise 
df[c(sample(1:100,40)),c("growth", "category")] <- NA 


ggplot(df, aes(map_id = id)) + 
    geom_map(aes(fill = growth, color = category), map =world.ggmap) + 
    expand_limits(x = world.ggmap$long, y = world.ggmap$lat) + 
    scale_fill_gradient(low = "red", high = "blue", guide = "colorbar") 

Tuttavia, questa soluzione non è un bel modo per visualizzare sia growth e category. Growth è molto visibile, ma è quasi impossibile vedere category perché è solo un confine.

Ho provato ad aumentare la dimensione dei bordi, ma senza fortuna (la nuova geom_map è difficile da lavorare). Qualcuno sa come aumentare la dimensione del bordo nell'esempio sopra, o ancora meglio, un meccanismo per visualizzare due fattori?

Una domanda bonus: i nomi dei paesi, come quelli utilizzati dal pacchetto mappe (che presenta USSR!) Sono i dati utilizzati nell'esempio fragili. Preferisco usare ISO 3166-1 alpha-3 (1). Qualcuno sa dati immediatamente utilizzabili con ggplot2 che dispone di nomi ISO -... paese (incluso nei dati connessi)

Risultato:

result http://ompldr.org/vY3hsYQ

+0

che cosa è world.map? non è definito nel tuo codice. Se provo a fortificare (w, region = "NAME"), ottengo un errore "carattere multibyte non valido". Si prega di fornire il codice riproducibile. –

+0

Siamo spiacenti, corretto. Era w. – Rasmus

+0

Viene visualizzato il seguente errore nella riga di correzione: "Errore in nchar (ID): stringa multibyte non valida 1" –

risposta

12

vorrei utilizzare diverse gamme di tonalità per il riempimento e il colore della linea :

ggplot(df, aes(map_id = id)) + 
    geom_map(aes(fill = growth, color = category), map =world.ggmap) + 
    expand_limits(x = world.ggmap$long, y = world.ggmap$lat) + 
    scale_fill_gradient(high = "red", low = "white", guide = "colorbar") + 
    scale_colour_hue(h = c(120, 240)) 

enter image description here

O, utilizzare il riempimento per la categoria e la trasparenza per il livello di crescita.

ggplot(df, aes(map_id = id)) + 
    geom_map(aes(alpha = growth, fill = category), map =world.ggmap) + 
    expand_limits(x = world.ggmap$long, y = world.ggmap$lat) + 
    scale_alpha(range = c(0.2, 1), na.value = 1) 

enter image description here

Dipende da ciò che si desidera mostrare.

Solo nel caso, qui è il modo per cambiare lo spessore di linea:

ggplot(df, aes(map_id = id)) + 
geom_map(aes(fill = growth, color = category, size = factor(1)), map =world.ggmap) + 
expand_limits(x = world.ggmap$long, y = world.ggmap$lat) + 
scale_fill_gradient(high = "red", low = "white", guide = "colorbar") + 
scale_colour_hue(h = c(120, 240)) + 
scale_size_manual(values = 2, guide = FALSE) 

enter image description here

Ecco la versione HSV:

df$hue <- ifelse(is.na(df$category), 0, as.numeric(df$category)/max(as.numeric(df$category), na.rm=T)) 
df$sat <- ifelse(is.na(df$growth), 0, df$growth/max(df$growth, na.rm=T)) 
df$fill <- ifelse(is.na(df$category), "grey50", hsv(df$hue, df$sat)) 

ggplot(df, aes(map_id = id)) + 
geom_map(aes(fill = fill), map =world.ggmap) + 
expand_limits(x = world.ggmap$long, y = world.ggmap$lat) + 
scale_fill_identity(guide = "none") 

enter image description here

+1

Grazie! Il problema è che la linea "abbastanza spessa" sia visibile, anche se il grafico è stampato in piccolo. – Rasmus

+1

Penso che tu stia chiedendo troppo. Non penso sia possibile mostrare così tante informazioni con un piccolo giornale. – kohske

+0

Puoi trovare il modo di modificare la lineize, ma in realtà non penso che sia utile ... – kohske

7

Una possibilità è quella di mappare la crescita alla dimensione di alcuni punti tracciati al centroide del poligoni.

centroids <- as.data.frame(coordinates(world.map)) 
df <- data.frame(df,centroids) 

choropleth <-ggplot() + 
    geom_map(aes(fill = category, map_id = id),data = df, map =world.ggmap) + 
    expand_limits(x = world.ggmap$long, y = world.ggmap$lat) + 
    scale_fill_hue(na.value=NA) 
choropleth 



choropleth + geom_point(aes(x=V1,y=V2,size=growth),data=df) + 
    scale_area(range=c(0,3)) 

enter image description here

Oppure, se si vuole veramente di raddoppiare il codice colore, è possibile colorare i punti, invece. Nota che puoi anche aggiungere una mappa raster di immagini satellitari con il nuovo pacchetto OpenStreetMap (plug vergine).

library(OpenStreetMap) 
library(raster) 
rastermap <- openmap(c(70,-179), 
     c(-70,179),zoom=2,type='bing') 
rastermap <- openproj(rastermap) 
autoplot(rastermap,expand=FALSE) + 
    geom_map(aes(x=70,y=70,fill = category, map_id = id),data = df, 
     map =world.ggmap) + 
    expand_limits(x = world.ggmap$long, y = world.ggmap$lat) + 
    scale_fill_hue(na.value=NA) + 
    geom_point(aes(x=V1,y=V2,colour=growth),data=df) + 
    scale_colour_gradient(low = "red", high = "blue", 
     guide = "colorbar",na.value=NA) 

enter image description here

+0

Ian , il tuo pacchetto sembra bello! [1] aggiunge un tocco di classe. Aggiungere una compilation alfa (ed) sarebbe probabilmente molto interessante. BTW: sei a conoscenza del pacchetto ggmap? Sulla base dell'astratto suonano simili. L'idea del punto è una grande idea. Usando una stella o qualcosa che sembra meno linkare un inchiostro puzzare questo potrebbe essere trasformato in qualcosa di bello. Grazie! – Rasmus

+0

Sono a conoscenza del pacchetto. OpenStreetMap è fondamentalmente una sostituzione sia per RGoogleMaps che per ggmap. Fa cose interessanti come la cache delle tessere e le trasformazioni delle mappe di proiezione. –

+0

@IanFellows Se interessati, ho appena fatto una domanda correlata (usando lo stesso esempio) qui: http://stackoverflow.com/questions/13219387/world-map-map-halves-of-countries-to-different-colors –