2013-08-24 10 views
7

मैं इस प्रश्न में Cartogram + choropleth map in R से पूछताछ करने की कोशिश कर रहा हूं, लेकिन एक स्पैटलियल पॉलीगन्सडेटाफ्रेम से शुरू करना और उसी प्रकार के ऑब्जेक्ट के साथ समाप्त होने की उम्मीद कर रहा हूं।SpatialPolygonsDataFrame ऑब्जेक्ट पर Rcartogram का उपयोग करें

मैं ऑब्जेक्ट को आकारफाइल के रूप में सहेज सकता हूं, scapetoad का उपयोग कर इसे फिर से खोलता हूं और वापस परिवर्तित करता हूं, लेकिन मैं इसे आर के भीतर सब कुछ लेता हूं ताकि प्रक्रिया पूरी तरह से पुन: उत्पन्न हो सके, और ताकि मैं स्वचालित रूप से दर्जनों भिन्नताओं को कोड कर सकूं ।

मैं GitHub पर Rcartogram कोड काँटेदार और मेरे प्रयासों अब तक here जोड़ दिया है।

अनिवार्य रूप से यह डेमो मानचित्र पर एक स्थानिक ग्रिड बनाता है, ग्रिड के प्रत्येक बिंदु पर जनसंख्या घनत्व को देखता है और इसे cartogram() पर काम करने के लिए आवश्यक प्रारूप में घनत्व मैट्रिक्स में परिवर्तित करता है। अब तक सब ठीक है।

लेकिन, कैसे cartogram() के उत्पादन के आधार पर मूल नक्शा अंक को जोड़ के लिए?

यहां दो समस्याएं हैं। सबसे पहले नक्शा और ग्रिड को एक ही इकाइयों में इंटरपोलेशन की अनुमति देने के लिए प्राप्त करना है। दूसरा, प्रत्येक बहुभुज के प्रत्येक बिंदु तक पहुंचने, इसे अलग करने, और उन्हें सही क्रम में रखने के लिए है।

ग्रिड ग्रिड इकाइयों में है और नक्शा अनुमान इकाइयों में है (उदाहरण के longlat के मामले में)। या तो ग्रिड को लंबे समय तक, या नक्शा ग्रिड इकाइयों में पेश किया जाना चाहिए। मेरा विचार है कि नकली सीआरएस बनाना और spTransform() फ़ंक्शन के साथ package(rgdal) में फ़ंक्शन का उपयोग करना है, क्योंकि यह ऑब्जेक्ट में प्रत्येक बिंदु को कम से कम झगड़े से संभालता है।

हर बिंदु तक पहुंचना मुश्किल है क्योंकि वे कई परतों SpPDF वस्तु में नीचे हैं: object> बहुभुज> बहुभुज> लाइनों> coords मुझे लगता है। किसी भी विचार को समग्र मानचित्र की संरचना को बरकरार रखने के दौरान इन तक पहुंच कैसे प्राप्त करें?

+0

मैं सिर्फ पोस्टिंग के बाद इस सवाल पर ठोकर खाई है [अपने ही] (http://stackoverflow.com/questions/32406216/population-weighted-polygon-distortion/) और 'का उपयोग कर अपने आप को Rcartogram' के साथ संघर्ष कर। अब तक मेरी सिफारिश स्केपटोड का उपयोग कर रही है; मैं यह तय करने की कोशिश कर रहा हूं कि मेरे लिए आर में अपनी सादगी को बंद करना संभव है या नहीं – MichaelChirico

उत्तर

2

इस समस्या को getcartr पैकेज के साथ हल किया जा सकता है, Chris Brunsdon's GitHub पर उपलब्ध है, जैसा कि this ब्लॉग पोस्ट में खूबसूरती से समझाया गया है।

quick.carto फ़ंक्शन ठीक वही करता है जो आप चाहते हैं - SpatialPolygonsDataFrame इनपुट के रूप में लेता है और SpatialPolygonsDataFrame आउटपुट के रूप में होता है।

ब्लॉग पोस्ट यहाँ में उदाहरण का सार मामले में कड़ी मृत हो जाता है, मेरी खुद की शैली & लिखने की त्रुटियों तय में मिलाया साथ Reproducing:

(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

संबंधित मुद्दे