Choroplèth en R: coupures personnalisées et traçage

13

J'ai une question concernant le tracé d'une carte de choroplèthes. Que recommande-t-on pour tracer une carte avec des coupures personnalisées? Et rendez-le un peu attrayant.

Dans mon script, j'ai utilisé la commande plot and spplot pour visualiser certaines données mais je ne suis pas entièrement satisfait du résultat. C'est facile de voir pourquoi. En utilisant spplot, j'obtiens une rampe de couleurs qui répète les couleurs pour différentes valeurs, ce qui est un peu bizarre. En utilisant l' intrigue avec les coupures personnalisées, je n'ai pas pu faire de meilleurs intervalles pour les valeurs, telles que, par exemple, les valeurs nulles sont blanches sur la carte. Les proportions asymétriques entre la légende et la carte sont, je pense, probablement le résultat de Rstudio.

Je me suis donc demandé si quelqu'un avait de meilleures suggestions pour tracer des cartes choroplèthes dans R en utilisant des sauts personnalisés?

EDIT 20-02-2013

Comme suggéré, j'ai utilisé ggplot2 pour créer une carte choroplèth. J'ai utilisé le code ci-dessous. J'ai rencontré deux problèmes. La première est qu'après fortification des données, toutes les données du fichier de formes ne sont pas transférées dans la trame de données. Je dois donc renommer la variable "id" afin de pouvoir fusionner les données. Problème mineur.

Un problème plus important est que, malgré le fait que les données dans le cadre de données sont correctes, le ggplot affiche une carte où les données sont incorrectes. La valeur de couleur selon la légende ne correspond pas à la valeur de la variable dans les données. Suis-je en train d'oublier quelque chose ici?

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

Lien vers les données de réplication

Mise à jour 13-11-2015: lien fixe vers le fichier de forme . Voir la réponse ci-dessous pour une solution sur la façon de tracer le choroplèth.

horseoftheyear
la source
5
Je voudrais également envisager d'utiliser ggplot2des cartes choroplèthes, qui, à mon avis, se révèlent mieux par défaut.
SlowLearner
Oui, je n'étais pas sûr d'utiliser ggplot2 car les données long / lat de mon fichier de formes spécifient uniquement un point et non le contour des frontières nationales. J'ai donc utilisé ces tracés pour créer une carte choroplèth. Je ne suis pas très familier avec la gestion des données SIG dans R, donc je ne sais pas si j'oublie une solution vraiment simple pour cela.
horseoftheyear
Veuillez corriger le lien vers le fichier de formes.
poisson
Bien sûr pas de problème.
horseoftheyear

Réponses:

6

Je ne vois pas de problème avec le code ci-dessus, sauf que vous avez 6 niveaux clairs onset, donc je les traiterais comme des facteurs plutôt que comme une variable continue. Notez l' factorappel dans le code ci-dessous.

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

Ce code donne le résultat suivant:

original

Si vous voulez des couleurs personnalisées, vous pouvez essayer ceci:

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

Ce qui produit ceci:

couleurs personnalisées

SlowLearner
la source
Cependant, il trace toujours les mauvaises valeurs. Très particulier.
horseoftheyear
OK, pouvez-vous spécifier exactement quel est le problème, avec des exemples? L'Angola se voit attribuer un 3pour la onsetcolonne et trace un 3dans le graphique. Cela semble fonctionner. Vraisemblablement il me manque quelque chose?
SlowLearner
Ow oui désolé. L'Angola est l'un des rares à avoir raison. Si vous regardez l'Afrique du Sud, la Namibie ou le Sénégal par exemple, vous verrez que la valeur indiquée par la couleur ne correspond pas à la valeur dans les données. Le Sénégal devrait donc être un 6 (maintenant un 2), l'Afrique du Sud 0 (4) et la Namibie également 0 (1). Le Burundi et le Rwanda sont également loin d'en nommer quelques autres. Dans le lien , j'ai tracé un tracé avec spplot qui montre une carte avec les valeurs correctes. Ce tracé se fait directement à partir du fichier de formes. Je suppose donc que quelque chose ne va pas avec la création de la trame de données.
horseoftheyear
5

Le package classInt a un certain nombre de fonctions pour calculer les intervalles pour les données numériques - installez-le et lisez les documents.

Spacedman
la source
Oui, j'ai utilisé le package classInt avec des interruptions fixes (non affichées dans le script) mais le problème est qu'il calcule les intervalles pour les données numériques continues. Alors que mes intervalles sont discrets, ils représentent une fréquence d'événements. Je n'ai pas encore découvert comment améliorer cela.
horseoftheyear
1

Pour les archives, la solution que j'ai utilisée:

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

entrez la description de l'image ici

horseoftheyear
la source
Il existe un package pour R qui offre des fonctionnalités de mappage utiles. Elle s'appelle cartographie (et permet notamment de choroplèter des cartes selon la documentation). Désolé si c'est hors sujet (comme vous avez déjà trouvé votre réponse) mais disons que c'est pour référence future ..!
mgc
Ça a l'air plutôt sympa. Je vais certainement essayer pour d'autres travaux, donc merci pour la référence.
horseoftheyear