Coropleth in R: interruzioni personalizzate e trama


13

Ho una domanda per quanto riguarda la stampa di una mappa coropletica. Cosa è raccomandato per quanto riguarda la stampa di una mappa con interruzioni personalizzate? E farlo sembrare un po 'attraente.

Nel mio script ho usato il comando plot e spplot per visualizzare alcuni dati, ma non sono completamente soddisfatto del risultato. È facile capire perché. Usando spplot ottengo una scala di colori che ripete i colori per valori diversi, il che è un po 'strano. Usando la trama con le interruzioni personalizzate non sono stato in grado di fare intervalli migliori per i valori, in modo che ad esempio i valori zero siano bianchi sulla mappa. Le proporzioni distorte tra leggenda e mappa sono probabilmente il risultato di Rstudio.

Quindi mi chiedevo se qualcuno avesse suggerimenti migliori per tracciare mappe coropletiche in R usando interruzioni personalizzate?

MODIFICA 20-02-2013

Come suggerito, ho usato ggplot2 per creare una mappa coropletica. Ho usato il codice qui sotto. Ho riscontrato due problemi. Uno è che dopo aver fortificato i dati non tutti i dati dallo shapefile vengono trasferiti al frame di dati. Quindi devo rinominare la variabile "id" in modo da poter unire i dati. Problema minore.

Un problema maggiore è che nonostante i dati nel frame di dati siano corretti, ggplot mostra una mappa in cui i dati non sono corretti. Il valore del colore secondo la legenda non corrisponde al valore della variabile nei dati. Sto trascurando qualcosa qui?

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

Collegamento ai dati di replica

Aggiornamento 13-11-2015: corretto il collegamento al file di forma . Vedi la risposta sotto per la soluzione su come tracciare la coropleth.


5
Vorrei anche usare le ggplot2mappe per coropleth, che secondo me risulta un output più bello per impostazione predefinita.
SlowLearner,

Sì, non ero sicuro di usare ggplot2 poiché i dati long / lat nel mio shapefile specificano solo un punto e non il contorno dei confini nazionali. Quindi ho usato questi grafici per creare una mappa coropletica. Non ho molta familiarità con la gestione dei dati GIS in R, quindi non sono sicuro se sto trascurando una soluzione davvero semplice per questo.
cavallo del

Correggi il link allo shapefile.
pesce palla

Certo nessun problema.
cavallo del

Risposte:


6

Non vedo un problema con il codice sopra, tranne per il fatto che hai 6 livelli chiari in onset, quindi li tratterei come fattori piuttosto che come una variabile continua. Nota la factorchiamata nel codice qui sotto.

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

Tale codice fornisce il seguente risultato:

originale

Se vuoi colori personalizzati puoi provare questo:

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

Che produce questo:

colori personalizzati


Traccia comunque comunque i valori sbagliati. Molto particolare.
cavallo del

OK, puoi specificare esattamente qual è il problema, con esempi? All'Angola viene assegnato un 3per la onsetcolonna e traccia un 3a nel grafico. Sembra funzionare. Presumibilmente mi manca qualcosa?
SlowLearner,

O sì, scusa. L'Angola è uno dei pochi che è corretto. Se osservi il Sudafrica, la Namibia o il Senegal, ad esempio, vedrai che il valore indicato dal colore non corrisponde al valore nei dati. Quindi il Senegal dovrebbe essere un 6 (ora un 2), il Sudafrica 0 (4) e anche la Namibia 0 (1). Anche il Burundi e il Ruanda ne citano alcuni altri. Nel link ho realizzato una trama con spplot che mostra una mappa con i valori corretti. Questo diagramma viene eseguito direttamente dal file di forma. Quindi immagino che qualcosa vada storto nella creazione del dataframe.
cavallo del

5

Il pacchetto classInt ha una serie di funzioni per calcolare gli intervalli per i dati numerici: installalo e leggi i documenti.


Sì, ho usato il pacchetto classInt con interruzioni fisse (non mostrate nello script) ma il problema è che calcola gli intervalli per i dati numerici continui. Mentre i miei intervalli sono discreti, rappresentano una frequenza di eventi. Non ho ancora scoperto come migliorarlo.
cavallo del

1

Per gli archivi, la soluzione che ho usato:

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

inserisci qui la descrizione dell'immagine


Esiste un pacchetto per R che offre utili funzionalità di mappatura. Si chiama cartografia (e in particolare consente di coropleth mappe secondo la documentazione). Scusa se è fuori tema (come hai già trovato la tua risposta) ma diciamo che è per riferimento futuro ..!
mgc,

Sembra piuttosto carino. Lo proverò sicuramente per altri lavori, quindi grazie per il riferimento.
cavallo del
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.