13 votos

Choropleth en R: cortes y trazados personalizados

Tengo una pregunta sobre el trazado de un mapa de coropletas. ¿Qué se recomienda para trazar un mapa con cortes personalizados? Y que tenga un aspecto atractivo.

En mi script He utilizado el comando plot y spplot para visualizar algunos datos pero no estoy del todo contento con el resultado. Es fácil ver por qué. Utilizando spplot Obtengo una rampa de color que repite los colores para diferentes valores, lo cual es un poco extraño. Usando parcela con las pausas personalizadas No he podido hacer mejores intervalos para los valores, de manera que, por ejemplo, los valores cero sean blancos en el mapa. Las proporciones sesgadas entre la leyenda y el mapa creo que son probablemente el resultado de Rstudio.

Así que me preguntaba si alguien tiene mejores sugerencias para trazar mapas de coropletas en R utilizando saltos personalizados.

EDITAR 20-02-2013

Como se ha sugerido, he utilizado ggplot2 para crear un mapa de coropletas. He utilizado el código siguiente. He encontrado dos problemas. Uno es que después de fortificar los datos no todos los datos del shapefile se transfieren al marco de datos. Así que tengo que cambiar el nombre de la variable "id" para poder fusionar los datos. Un 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 del color según la leyenda no se corresponde con el valor de la variable en los datos. ¿Estoy pasando algo por alto?

# 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 los datos de réplica

Actualización 13-11-2015: Enlace fijo a archivo de forma . Vea la respuesta más abajo para la solución de cómo trazar el coropleto.

5 votos

También miraría de usar ggplot2 para los mapas de coropletas, que creo que da un mejor resultado por defecto.

0 votos

Sí, no estaba seguro de utilizar ggplot2 ya que los datos long/lat de mi shapefile sólo especifican un punto y no el contorno de las fronteras nacionales. Por lo tanto, utilicé estos gráficos para crear un mapa coropleto. No estoy muy familiarizado con el manejo de datos GIS en R, así que no estoy seguro de si estoy pasando por alto alguna solución realmente sencilla para eso.

0 votos

Por favor, arregle el enlace al shapefile.

6voto

strider24 Puntos 725

No veo ningún problema con el código anterior, excepto que tienes 6 niveles claros en onset Por lo tanto, los trataría como factores y no como una variable continua. Tenga en cuenta el factor en el código siguiente.

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:

custom colours

0 votos

Sin embargo, sigue trazando los valores erróneos. Muy peculiar.

0 votos

Bien, ¿puede especificar exactamente cuál es el problema, con ejemplos? A Angola se le asigna un 3 para el onset y traza una 3 en el gráfico. Eso parece funcionar. ¿Supongo que me estoy perdiendo algo?

0 votos

Oh, sí, lo siento. Angola es uno de los pocos que es correcto. Si miras a Sudáfrica, Namibia o Senegal, por ejemplo, verás que el valor indicado por el color no se corresponde con el valor de los datos. Así, Senegal debería ser un 6 (ahora un 2), Sudáfrica un 0 (4) y Namibia también un 0 (1). Burundi y Ruanda también están fuera, por nombrar otros. En el enlace un gráfico que hice con spplot que muestra un mapa con los valores correctos. Este gráfico está hecho directamente desde el shapefile. Así que supongo que algo va mal con la creación del marco de datos.

5voto

Jay Bazuzi Puntos 194

El paquete classInt tiene un número de funciones para calcular intervalos para datos numéricos - instálelo y lea la documentación.

0 votos

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

1voto

edude05 Puntos 203

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)))

enter image description here

0 votos

Existe un paquete para R que ofrece una útil funcionalidad de mapeo. Se llama cartografía (y en particular permite mapas coropléticos según la documentación). ¡Lo siento si es fuera de tema (ya que ya encontró su respuesta) pero digamos que es para futuras referencias !

0 votos

Tiene muy buena pinta. Sin duda lo probaré para otros trabajos, así que gracias por la referencia.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X