2013-08-24 8 views
7

Ich versuche, das gleiche zu tun, in dieser Frage gefragt, Cartogram + choropleth map in R, aber ausgehend von einem SpatialPolygonsDataFrame und in der Hoffnung, mit dem gleichen Objekttyp enden.Verwenden Sie Rcartogram auf einem SpatialPolygonsDataFrame-Objekt

Ich könnte das Objekt als Shapefile speichern, scapetoad verwenden, es wieder öffnen und zurück konvertieren, aber ich würde lieber alles innerhalb von R haben, damit das Verfahren vollständig reproduzierbar ist, und so kann ich Dutzende von Variationen automatisch codieren .

Ich habe den Rcartogram-Code auf github gegabelt und meine bisherigen Bemühungen hinzugefügt here.

Im Wesentlichen erstellt diese Demo ein SpatialGrid über der Karte, suchen Sie die Bevölkerungsdichte an jedem Punkt des Gitters und konvertieren Sie diese in eine Dichte-Matrix im Format cartogram(), um zu arbeiten. So weit, ist es gut.

Aber, wie interpoliert man die ursprünglichen Kartenpunkte basierend auf der Ausgabe von cartogram()?

Hier gibt es zwei Probleme. Die erste besteht darin, die Karte und das Gitter in die gleichen Einheiten zu bringen, um eine Interpolation zu ermöglichen. Die zweite besteht darin, auf jeden Punkt jedes Polygons zuzugreifen, es zu interpolieren und alle in der richtigen Reihenfolge zu halten.

Das Gitter befindet sich in Gittereinheiten und die Karte befindet sich in projizierten Einheiten (im Fall des Beispiels longlat). Entweder muss das Gitter in LongLat oder die Karte in Gittereinheiten projiziert werden. Mein Gedanke ist, ein gefälschtes CRS zu machen und dieses zusammen mit der spTransform() Funktion in package(rgdal) zu verwenden, da dieses jeden Punkt im Gegenstand mit minimalem Aufwand behandelt.

Zugriff auf jeden Punkt ist schwierig, weil sie mehrere Ebenen nach unten in das SpPDF-Objekt sind: Objekt> Polygone> Polygone> Linien> Koordinaten Ich denke. Irgendwelche Ideen, wie man auf diese zugreifen kann, während die Struktur der Gesamtkarte intakt bleibt?

+0

Ich bin gerade über diese Frage gestolpert, nachdem ich [meine eigene] (http://stackoverflow.com/questions/32406216/population-gewichtete-polygon-verzerrung/) gepostet habe und selbst mit 'Rcartogram' zu kämpfen habe. Soweit meine Empfehlung ist ScapeToad; Ich versuche zu entscheiden, ob es mir möglich ist, seine Einfachheit in R zu portieren – MichaelChirico

Antwort

2

Dieses Problem kann mit dem getcartr Paket behoben werden, das auf Chris Brunsdon's GitHub verfügbar ist, wie schön in this blog post expliziert.

Die quick.carto Funktion macht genau das, was Sie wollen - nimmt eine SpatialPolygonsDataFrame als Eingabe und hat eine SpatialPolygonsDataFrame als Ausgabe.

Reproducing das Wesen des Beispiels in der Blog-Post hier im Fall der Link tot geht, mit meinem eigenen Stil gemischt in & Fehlern behoben:

(Shapefile; World Bank population data)

library(getcartr) 
library(maptools) 
library(data.table) 

world <- readShapePoly("TM_WORLD_BORDERS-0.3.shp") 
#I use data.table, see blog post if you want a base approach; 
# data.table wonks may be struck by the following step as seeming odd; 
# see here: http://stackoverflow.com/questions/32380338 
# and here: https://github.com/Rdatatable/data.table/issues/1310 
# for some background on what's going on. 
[email protected] <- setDT([email protected]) 

world.pop <- fread("sp.pop.totl_Indicator_en_csv_v2.csv", 
        select = c("Country Code", "2013"), 
        col.names = c("ISO3", "pop")) 

[email protected][world.pop, Population := as.numeric(i.pop), on = "ISO3"] 

#calling quick.carto has internal calls to the 
# necessary functions from Rcartogram 
world.carto <- quick.carto(world, world$Population, blur = 0) 

#plotting with a color scale 
x <- [email protected][!is.na(Population), log10(Population)] 
ramp <- colorRampPalette(c("navy", "deepskyblue"))(21L) 
xseq <- seq(from = min(x), to = max(x), length.out = 21L) 
#annoying to deal with NAs... 
cols <- ramp[sapply(x, function(y) 
    if (length(z <- which.min(abs(xseq - y)))) z else NA)] 

plot(world.carto, col = cols, 
    main = paste0("Cartogram of the World's", 
        " Population by Country (2013)")) 

enter image description here

Verwandte Themen