Choropleth in R: benutzerdefinierte Pausen und Plotten


13

Ich habe eine Frage zum Zeichnen einer Choroplethenkarte. Was wird für das Plotten einer Karte mit benutzerdefinierten Unterbrechungen empfohlen? Und machen Sie es ein bisschen attraktiv.

In meinem Skript habe ich den Befehl plot und spplot verwendet, um einige Daten zu visualisieren, aber ich bin mit dem Ergebnis nicht ganz zufrieden. Es ist leicht zu verstehen, warum. Mit spplot erhalte ich eine Farbrampe , die Farben für verschiedene Werte wiederholt, was etwas seltsam ist. Bei der Verwendung von Plots mit benutzerdefinierten Pausen konnte ich keine besseren Intervalle für die Werte festlegen, sodass beispielsweise Nullwerte auf der Karte weiß sind. Die schiefen Proportionen zwischen Legende und Karte sind vermutlich das Ergebnis von Rstudio.

Also habe ich mich gefragt, ob jemand bessere Vorschläge für das Plotten von Choroplethen-Karten in R mit benutzerdefinierten Unterbrechungen hat.

EDIT 20-02-2013

Wie vorgeschlagen, habe ich ggplot2 zum Erstellen einer Choroplethen-Karte verwendet. Ich habe den folgenden Code verwendet. Ich bin auf zwei Probleme gestoßen. Einer ist, dass nach dem Verstärken der Daten nicht alle Daten aus dem Shapefile in den Datenrahmen übertragen werden. Deshalb muss ich die Variable "id" umbenennen, damit ich die Daten zusammenführen kann. Geringes Problem.

Ein größeres Problem ist, dass trotz der Tatsache, dass die Daten im Datenrahmen korrekt sind, das ggplot eine Karte anzeigt, auf der die Daten falsch sind. Der Farbwert gemäß der Legende entspricht nicht dem Wert der Variablen in den Daten. Übersehen ich hier etwas?

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

Verknüpfung zu Replikationsdaten

Update 13-11-2015: Link zur Shape-Datei korrigiert . In der Antwort unten finden Sie eine Lösung für die Darstellung des Choropleths.


5
Ich würde mir auch die Verwendung ggplot2von Choropleth-Karten ansehen , die meiner Meinung nach standardmäßig besser aussehen.
SlowLearner

Ja, ich war mir nicht sicher, ob ich ggplot2 verwenden sollte, da die Long / Lat-Daten in meinem Shapefile nur einen Punkt und nicht den Umriss der nationalen Grenzen angeben. Deshalb habe ich diese Diagramme verwendet, um eine Choroplethenkarte zu erstellen. Ich bin nicht sehr vertraut mit dem Umgang mit GIS-Daten in R, daher bin ich mir nicht sicher, ob ich eine wirklich einfache Lösung dafür übersehen soll.
Horseoftheyear

Bitte korrigieren Sie den Link zum Shapefile.
Kugelfisch

Sicher kein Problem.
Pferdedes Jahres,

Antworten:


6

Ich sehe kein Problem mit dem obigen Code, außer dass Sie 6 klare Ebenen haben onset, daher würde ich sie eher als Faktoren als als kontinuierliche Variable behandeln. Notieren Sie den factorAufruf im Code unten.

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

Dieser Code ergibt folgendes Ergebnis:

Original

Wenn Sie benutzerdefinierte Farben möchten, können Sie dies versuchen:

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

Welches erzeugt dies:

benutzerdefinierte Farben


Es werden jedoch immer noch die falschen Werte angezeigt. Sehr eigenartig.
Pferd im Jahr

OK, können Sie anhand von Beispielen genau angeben, um welches Problem es sich handelt? Angola wird ein 3für die onsetSpalte zugewiesen und zeichnet ein 3im Diagramm. Das scheint zu funktionieren. Vermutlich fehlt mir etwas?
SlowLearner

Oh ja, tut mir leid. Angola ist eines der wenigen, die richtig sind. Wenn Sie beispielsweise nach Südafrika, Namibia oder Senegal schauen, werden Sie feststellen, dass der durch die Farbe angegebene Wert nicht mit dem Wert in den Daten übereinstimmt. Senegal sollte also eine 6 (jetzt eine 2) sein, Südafrika 0 (4) und Namibia ebenfalls 0 (1). Burundi und Ruanda sind auch einige andere. In dem Link habe ich einen Plot mit spplot gemacht, der eine Karte mit den korrekten Werten zeigt. Dieser Plot wird direkt aus dem Shapefile erstellt. Ich denke also, dass beim Erstellen des Datenrahmens etwas schief geht.
Pferd des Jahres

5

Das classInt-Paket verfügt über eine Reihe von Funktionen zum Berechnen von Intervallen für numerische Daten - installieren Sie es und lesen Sie die Dokumente.


Ja, ich habe das classInt-Paket mit festen Unterbrechungen verwendet (im Skript nicht gezeigt), aber das Problem ist, dass es Intervalle für fortlaufende numerische Daten berechnet. Während meine Intervalle diskret sind, repräsentieren sie eine Häufigkeit von Ereignissen. Ich habe noch nicht herausgefunden, wie ich das verbessern kann.
Horseoftheyear

1

Für die Archive habe ich folgende Lösung verwendet:

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

Bildbeschreibung hier eingeben


Es gibt ein Paket für R, das nützliche Zuordnungsfunktionen bietet. Es heißt Kartographie (und erlaubt insbesondere das Choropleth von Karten gemäß der Dokumentation). Es tut uns leid, wenn es nicht zum Thema gehört (da Sie Ihre Antwort bereits gefunden haben), aber sagen wir, es dient als Referenz für die Zukunft.
mgc

Das sieht ziemlich gut aus. Ich werde es auf jeden Fall für andere Arbeiten versuchen, also danke für den Hinweis.
PferdedesJahres,
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.