2012-03-04 18 views
21

Quiero trazar un mapa del mundo usando ggplot2 (v.9) que combina dos piezas si la información. El siguiente ejemplo ilustra:mapa de ggplot 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") 

Sin embargo, esta solución no es una buena manera de mostrar tanto growth y category. Growth es muy visible, pero category es casi imposible de ver porque es solo un borde.

He intentado aumentar el tamaño de las fronteras, pero sin suerte (es difícil trabajar con el nuevo geom_map). ¿Alguien sabe cómo aumentar el tamaño del borde en el ejemplo anterior, o aún mejor, un mecanismo para mostrar dos factores?

Una pregunta adicional: nombres de países, como los utilizados por el paquete de mapas (que presenta la URSS!) Son los datos utilizados en el ejemplo es frágil. Prefiero usar ISO 3166-1 alpha-3 (1). ¿Alguien sabe de datos de fácil utilización con ggplot2 que cuenta con nombres ISO -... país (incluido en los datos vinculados)

Resultado:

result http://ompldr.org/vY3hsYQ

+0

lo que es world.map? no está definido en tu código. Si intento fortify (w, region = "NAME"), aparece un error de "carácter multibyte inválido". Por favor proporcione un código reproducible. –

+0

Lo sentimos, se corrigió. Fue w. – Rasmus

+0

Aparece el siguiente error en la línea fortify: "Error en nchar (ID): serie multibyte no válida 1" –

Respuesta

12

me gustaría utilizar diferentes rangos de tono de relleno y de línea :

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 bien, utilizar llenar para la categoría y la transparencia para el nivel de crecimiento.

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

Depende de lo que se quiere mostrar.

Por si acaso, aquí es la manera de cambiar la LINESIZE:

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

He aquí la versión VHS:

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

¡Gracias! El problema es hacer que la línea sea lo suficientemente gruesa para que se note, incluso si el gráfico se imprime pequeño. – Rasmus

+1

Creo que estás pidiendo demasiado. No creo que sea posible mostrar tanta información con un papel pequeño. – kohske

+0

Puede encontrar la manera de cambiar el tamaño lineal, pero en realidad no creo que esto sea útil ... – kohske

7

Una opción es mapa de crecimiento al tamaño de algunos puntos trazados en el centroide de la polígonos.

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

O si realmente quiere doblar código de color, se puede colorear los puntos en su lugar. Tenga en cuenta que también puede agregar un mapa de trama de imágenes satelitales con el nuevo paquete OpenStreetMap (plug sin vergüenza).

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 , su paquete se ve bien! [1] agrega un toque agradable. Agregar un relleno alfa (ed) probablemente se vea muy bien. Por cierto: ¿Es usted consciente del paquete ggmap? En base al resumen, suenan similares. La idea de punto es una gran idea. Al usar una estrella o algo que se ve menos se une un hedor a tinta, esto podría convertirse en algo agradable. ¡Gracias! – Rasmus

+0

Conozco el paquete. OpenStreetMap es básicamente un reemplazo tanto para RGoogleMaps como para ggmap. Hace cosas geniales como el almacenamiento en caché de teselas y las transformaciones de proyección de mapas. –

+0

@IanFellows Si está interesado, acabo de hacer una pregunta relacionada (usando el mismo ejemplo) aquí: http://stackoverflow.com/questions/13219387/world-map-map-halves-of-countries-to-different-colors –