Choropleth en R: saltos personalizados y trazado


13

Tengo una pregunta con respecto a trazar un mapa coroplético. ¿Qué se recomienda con respecto a trazar un mapa con saltos personalizados? Y haz que se vea un poco atractivo.

En mi script , he usado el comando plot y spplot para visualizar algunos datos, pero no estoy completamente satisfecho con el resultado. Es fácil ver por qué. Usando spplot obtengo una rampa de color que repite los colores para diferentes valores, lo cual es un poco extraño. Al usar el diagrama con los saltos personalizados, no he podido hacer mejores intervalos para los valores, de modo que, por ejemplo, los valores cero son blancos en el mapa. Las proporciones sesgadas entre la leyenda y el mapa son, creo, probablemente el resultado de Rstudio.

¿Entonces me pregunté si alguien tiene mejores sugerencias para trazar mapas coropléticos en R usando saltos personalizados?

EDITAR 20-02-2013

Como sugerí, he usado ggplot2 para crear un mapa coroplético. He usado el código a continuación. Encontré dos problemas. Una es que después de fortificar los datos, no todos los datos del archivo de forma se transfieren al marco de datos. Así que tengo que cambiar el nombre de la variable "id" para poder fusionar los datos. Problema menor.

Un problema mayor es que a pesar de que los datos en el marco de datos son correctos, el ggplot muestra un mapa donde los datos son incorrectos. El valor de color según la leyenda no se corresponde con el valor de la variable en los datos. ¿Estoy pasando por alto algo aquí?

# Plotting polygon shapefiles (try-out)
# Load the packages
require(rgdal)
require(maptools)
require(ggplot2)
gpclibPermit() # required for the fortify method
# Load the shapefile
africa=readOGR("/home/GIS",layer="africaII")
names(africa) 
# Load the data on conflict
conflict<-read.csv("africa_conflict.csv", header=TRUE)
names(conflict)
# Merge the data together
africadat<-merge(africa, conflict, by="ISO3")
# Changing the data in the shapefile
africa@data <- africadat
# Fortify so that ggplot can plot
africa.points = fortify(africa,region="ISO3")
# Change "id" to "ISO3"such that the datasets can be merged again
names(africa.points)[names(africa.points)=="id"]<-"ISO3"
africa.df=merge(africa.points,africadat,by="ISO3")
# Plot the data
ggplot(africa.df) + 
aes(long,lat,group=group) + 
geom_polygon(aes(fill =onset))+
geom_path(color="white") +
coord_equal()

Enlace a datos de replicación

Actualización 13-11-2015: enlace fijo al archivo de forma . Vea la respuesta a continuación para obtener una solución sobre cómo trazar la coropleta.


55
También me gustaría ver el uso ggplot2de mapas coropléticos, que creo que resulta una salida de mejor aspecto por defecto.
SlowLearner

Sí, no estaba seguro de usar ggplot2 ya que los datos largos / largos en mi archivo de forma solo especifican un punto y no el contorno de las fronteras nacionales. Por lo tanto, utilicé estas parcelas para crear un mapa coroplético. No estoy muy familiarizado con el manejo de datos SIG en R, así que no estoy seguro de si estoy pasando por alto una solución realmente sencilla para eso.
horseoftheyear

Por favor arregle el enlace al archivo shape.
pez globo

Claro, no hay problema.
horseoftheyear

Respuestas:


6

No veo un problema con el código anterior, excepto que tiene 6 niveles claros onset, por lo que los trataría como factores en lugar de como una variable continua. Tenga factoren cuenta la llamada en el código a continuación.

ggplot(africa.df) +
  aes(long,lat,group=group) +
  geom_polygon(aes(fill = factor(onset)))+
  geom_path(color="white") +
  coord_equal()

Ese código da el siguiente resultado:

original

Si quieres colores personalizados, puedes probar esto:

library(RColorBrewer)
my.cols <- brewer.pal(6, "Blues")

ggplot(africa.df) +
  aes(long,lat,group=group) +
  geom_polygon(aes(fill = factor(onset)))+
  scale_fill_manual("Onset\n", values = my.cols, guide = "legend") +
  geom_path(color="white") +
  coord_equal()

Lo que produce esto:

colores personalizados


Sin embargo, todavía traza los valores incorrectos. Muy peculiar
horseoftheyear

OK, ¿puedes especificar exactamente cuál es el problema, con ejemplos? A Angola se le asigna un 3para la onsetcolumna y traza un 3en el gráfico. Eso parece funcionar. Presumiblemente me estoy perdiendo algo?
SlowLearner

Ow si lo siento. Angola es uno de los pocos que está en lo correcto. Si observa Sudáfrica, Namibia o Senegal, por ejemplo, verá que el valor indicado por el color no corresponde con el valor de los datos. Entonces, Senegal debería ser un 6 (ahora un 2), Sudáfrica 0 (4) y Namibia también 0 (1). Burundi y Ruanda también están fuera para nombrar algunos otros. En el enlace, hice un diagrama con spplot que muestra un mapa con los valores correctos. Esta trama se realiza directamente desde el archivo de forma. Así que supongo que algo sale mal al crear el marco de datos.
horseoftheyear

5

El paquete classInt tiene una serie de funciones para calcular intervalos para datos numéricos: instálelo y lea los documentos.


Sí, utilicé el paquete classInt con saltos fijos (no se muestra en el script), pero el problema es que calcula los intervalos para datos numéricos continuos. Mientras que mis intervalos son discretos, representan una frecuencia de eventos. Todavía no he descubierto cómo mejorar eso.
horseoftheyear

1

Para los archivos, la solución que utilicé:

#### Choropleth in R example ####

## Libraries
library(classInt)    
library(lattice)
library(RColorBrewer)    
library(sp)

## Shapefile for Sub-Sahara Africa (see link in Q)
africa<-readShapeSpatial("shp/africa.shp") 

## Add data to shapefile
# In this case the number of conflict onsets between 1981-2010
africa$onset<-c(3,0,3,1,3,1,4,2,3,0,
                2,0,3,1,1,0,2,1,1,1,
                2,0,3,0,1,0,0,4,2,1,
                3,0,1,0,6,1,3,1,1,0,
                0,1,1,0,0,0,0)

## Plot 
par(mar=c(1,4,1,1),family="serif")
trellis.par.set(axis.line=list(col=NA)) # Remove borders
spplot(africa,zcol="onset",col.regions=colorRampPalette(c("white","grey10"))(20),
main=list(label="Number of civil conflict onsets 1981-2010",cex=3),
pretty=T,par.settings=list(axis.text=list(cex=3)))

ingrese la descripción de la imagen aquí


Hay un paquete para R que ofrece funcionalidades de mapeo útiles. Se llama cartografía (y en particular permite coroptir mapas de acuerdo con la documentación). Lo siento si está fuera de tema (como ya encontraste tu respuesta) pero digamos que es para referencia futura ...!
mgc

Eso se ve muy bien. Sin duda lo intentaré para otro trabajo, así que gracias por la referencia.
horseoftheyear
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.