R में एनिमेटेड नक्शा


9

हर कोई, गड़बड़ी के लिए खेद है, लेकिन मैं आर के साथ काफी नया हूं, एक महत्वपूर्ण अंतर का सामना कर रहा हूं: मैं रुसिन का एक एनिमेटेड नक्शा बनाना चाहता हूं जिसमें अलग-अलग वर्षों के साथ बेरोजगारी में बदलाव होता है, जैसे। छवि पर आप एक वर्ष के लिए डेटा देख सकते हैंयहां छवि विवरण दर्ज करें

require(sp)
require(maptools)

require(RColorBrewer)
require(rgdal)
 rus<-url("http://www.filefactory.com/file/4h1hb5c1cw7r/n/RUS_adm1_RData")
print(load(rus))


unempl <- read.delim2(file="C:\\unempl1.txt", header = TRUE, 
        sep = ";",quote = "", dec=",", stringsAsFactors=F)

gadm_names <-gadm$NAME_1
total <- length(gadm_names)
pb <- txtProgressBar(min = 0, max = total, style = 3) 

order <- vector()
for (i in 1:total){  

  order[i] <- agrep(gadm_names[i], unempl$region, 
                     max.distance = 0.2)[1]
 setTxtProgressBar(pb, i)               # update progress bar
}


col_no <- as.factor(as.numeric(cut(unempl$data[order],
                    c(0,2.5,5,7.5,10,15,100))))


levels(col_no) <- c("<2,5%", "2,5-5%", "5-7,5%",
                    "7,5-10%", "10-15%", ">15%")


gadm$col_no <- col_no
myPalette<-brewer.pal(6,"Purples")



proj4.str <- CRS("+init=epsg:3413 +lon_0=105")
gadm.prj <- spTransform(gadm, proj4.str)

spplot(gadm.prj, "col_no", col=grey(.9), col.regions=myPalette,
main="Unemployment in Russia by region")

परिणाम, जिसे मैं प्राप्त करना चाहता हूं, वह यहां एनीमेशन जैसा कुछ है: http://spatial.ly/2011/02/mapping-londons-population-change-2011-2030/ हालांकि, मैंने बहुत कुछ जाना, कई विषयों को पढ़ा में http://stackoverflow.com : निम्नलिखित सहित आर में भूखंड की एक श्रृंखला से एक फिल्म बना रहा है , लेकिन अभी भी सही काम नहीं कर सका।

आपका अग्रिम में ही बहुत धन्यवाद!

मैंने कुछ इस तरह से काम किया है, क्या कोई मुझे बता सकता है कि गलती कहाँ है:

require(animation)
    require(sp)
    require(RColorBrewer) 
    require(classInt)     
require(rgdal)
 rus<-url("http://www.filefactory.com/file/4h1hb5c1cw7r/n/RUS_adm1_RData")
print(load(rus))




unempl1 <- read.delim2(file="C:\\unempl11.txt", header = TRUE, 
        sep = ";",quote = "", dec=",", stringsAsFactors=F)
unempl2<- read.delim2(file="C:\\unempl12.txt", header = TRUE, 
        sep = ";",quote = "", dec=",", stringsAsFactors=F)

gadm_names <-gadm$NAME_1


total <- length(gadm_names)
pb <- txtProgressBar(min = 0, max = total, style = 3) 

order <- vector()

for (i in 1:total){  

  order[i] <- agrep(gadm_names[i], unempl1$region, 
                     max.distance = 0.2)[1]
 setTxtProgressBar(pb, i)               # update progress bar
}


for (l in 1:total){  

  order[l] <- agrep(gadm_names[l], unempl2$region, 
                     max.distance = 0.2)[1]
 setTxtProgressBar(pb, i)               # update progress bar
}

col_no_1 <- as.factor(as.numeric(cut(unempl1$data[order],
                    c(0,2.5,5,7.5,10,15,100))))

col_no_2<- as.factor(as.numeric(cut(unempl2$data[order],
                    c(0,2.5,5,7.5,10,15,100))))
saveHTML(
      for(k in 1:2) {
        try<-get(paste("col_no_", k, sep = ""))

levels(try) <- c("<2,5%", "2,5-5%", "5-7,5%",
                    "7,5-10%", "10-15%", ">15%")


gadm$col_no <- try

myPalette<-brewer.pal(6,"Purples")



proj4.str <- CRS("+init=epsg:3413 +lon_0=105")
gadm.prj <- spTransform(gadm, proj4.str)

spplot(gadm.prj, "col_no", col=grey(.9), col.regions=myPalette,
main="Unemployment in Russia by region")
},img.name = "map", htmlfile = "unrus2.html")

यहां कोड को पुन: पेश करने में सक्षम होने के लिए डेटा है


पुन: संपादित करें: क्या कोड के साथ गलत हो रहा है?
whuber

चूंकि आपका उदाहरण प्रजनन योग्य नहीं है, इसलिए इसका निवारण करना मुश्किल है। कुछ चीजें 1 से बाहर निकलती हैं) आप एक लूप में स्थानिक परिवर्तन लागू कर रहे हैं, इसलिए आप इसे बार-बार 2 कर रहे हैं) आप "कोशिश" नामक एक ऑब्जेक्ट बना रहे हैं जो कि एक आर फ़ंक्शन 3 भी है) आप वास्तविक कॉलम नामों के माध्यम से पुनरावृति कर सकते हैं। ।, के लिए (i in c ("Var1", "Var2")) जिस तरह से आपके पास वर्तमान में यह कोडित है वह बहुत जटिल है 4) spplot के लिए आपकी कॉल सही नहीं है, आप इसे एक बकवास वेक्टर पास कर रहे हैं।
जेफरी इवांस

मुझे इस तरह की समझ न होने के लिए वास्तव में खेद है, लेकिन आर के साथ यह मेरा पहला वास्तविक अनुभव है, मैंने मुख्य प्रश्न में डेटा जोड़ा है, अगर यह आपको परेशान नहीं करेगा तो क्या आप कृपया सुधार के तरीके सुझा सकते हैं जैसे मैं वास्तव में हूं विचारों का हिस्सा है
रुविन रफैलोव

जवाबों:


4

यह उतना ही है जितना मैं जाता हूं। आपको इस कोड के आधार पर यह पता लगाने में सक्षम होना चाहिए। एक बार फिर, चूंकि आपकी समस्या का हल नहीं है, इसलिए मुझे समाधान बताने के लिए डमी डेटा बनाना पड़ा। Spplot का उपयोग करने में एक अजीब पहलू यह है कि चूंकि यह प्लॉट बनाने के लिए जाली का उपयोग करता है इसलिए आपको एक ऑब्जेक्ट बनाने और फिर ऑब्जेक्ट को प्रिंट करने की आवश्यकता होती है। अन्यथा आपको प्लॉट नहीं मिलता है।

require(animation)
require(sp)
require(RColorBrewer) 
require(classInt)     
require(rgdal)

load(url("http://www.filefactory.com/file/4h1hb5c1cw7r/n/RUS_adm1_RData"))
closeAllConnections()

# Set color palette
myPalette <- brewer.pal(6,"Purples")

# Reproject data
gadm <- spTransform(gadm, CRS("+init=epsg:3413 +lon_0=105"))

# Create dummy unployment data with 10% change in gadm object 
gadm@data$uemp2000 <- runif(dim(gadm)[1],0,50)
gadm@data$uemp2001 <- gadm@data$uemp2000 + (gadm@data$uemp2000 * 0.10) 
gadm@data$uemp2002 <- gadm@data$uemp2001 + (gadm@data$uemp2001 * 0.10) 
gadm@data$uemp2003 <- gadm@data$uemp2002 + (gadm@data$uemp2002 * 0.10) 
gadm@data$uemp2004 <- gadm@data$uemp2003 + (gadm@data$uemp2003 * 0.10) 
gadm@data$uemp2005 <- gadm@data$uemp2004 + (gadm@data$uemp2004 * 0.10) 

# Coerce into factors with defined levels
for( i in c("uemp2000","uemp2001","uemp2002","uemp2003","uemp2004","uemp2005") ) {
  gadm@data[,i] <- as.factor(as.numeric(cut(gadm@data[,i], 
                             c(0,2.5,5,7.5,10,15,100)))) 
    levels(gadm@data[,i]) <- c("<2,5%", "2,5-5%", "5-7,5%",
                               "7,5-10%", "10-15%", ">15%")                          
    } 

saveHTML(
  for(i in c("uemp2000","uemp2001","uemp2002","uemp2003","uemp2004","uemp2005")) {
    sp.plot <- spplot(gadm, i, col=grey(.9), col.regions=myPalette,
                      main=paste("Unemployment in Russia", i, sep=" - ") )
      print( sp.plot )
},img.name = "map", htmlfile = "unrus2.html")

धन्यवाद! मैं तुरंत कोशिश करूँगा। सिर्फ एक सवाल गडम @ डेटा $ uemp2001 <- गेडम @ डेटा $ uemp2000 + (गडम @ डेटा $ uemp2000 * 0.10) क्या मैं यहां दिए गए यादृच्छिक के बजाय txt डेटा लोड कर सकता हूं, कोई समस्या निवारण नहीं होगा?
रुविन रफेलोव

हां, वह कोड उदाहरण डेटा बनाने के साथ जुड़ा हुआ है। आप अपने खुद के डेटा का उपयोग करना चाहेंगे।
जेफरी इवांस

9

एनीमेशन पैकेज पर एक नज़र डालें । खोज के लायक कार्यों में से एक, जिसे तीसरे पक्ष के सॉफ़्टवेयर की आवश्यकता नहीं है, "saveHTML" है।

एनीमेशन पैकेज में "saveHTML" फ़ंक्शन का उपयोग करना बहुत सीधे आगे है। यहां उदाहरण कोड है जहां मैं यादृच्छिक जनसंख्या परिवर्तन का एक एनीमेशन बनाता हूं। "Expr" तर्क प्लॉटिंग फ़ंक्शन को परिभाषित करता है जिसे आप एनीमेशन में पास करना चाहते हैं। जैसा कि आप नीचे दिए गए कोड में देख सकते हैं कि मैंने प्रत्येक नकली कॉलम को प्लॉट करने के लिए लूप के लिए उपयोग किया था।

    require(animation)
    require(sp)
    require(RColorBrewer) 
    require(classInt)     

# Load your data and add random population change column
    load(url("http://www.gadm.org/data/rda/GBR_adm2.RData"))
      for( i in 1:10 ) {
        gadm@data[paste("Year",i, sep="")] <- runif(dim(gadm)[1],0,1) 
       }

# Create HTML animation using for loop for each simulated column    
    saveHTML(
      for(x in names(gadm@data)[19:28]) { 
      ani.options(interval = 0.5)  
       plotvar <- gadm@data[,x]
          nclr <- 9
         plotclr <- rev(brewer.pal(nclr,"BuPu"))
          cuts <- classIntervals(plotvar, style="fixed", 
               fixedBreaks=c(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,1))
               colcode <- findColours(cuts, plotclr)
          plot(gadm, col=colcode, border=NA, ylim=c(bbox(gadm)[,1][2], bbox(gadm)[,2][2]),
            xlim=c(bbox(gadm)[,1][1], bbox(gadm)[,2][1]))
            text(min(bbox(gadm)[1]), min(bbox(gadm)[2]), paste("Population Change",x,sep=" "))
          box()
        legend("topleft", legend=c("0-10%","10-20%","20-30%","30-40%","40-50%",
               "50-60%","60-70%","70-80%","80-100%"),
                 fill=attr(colcode, "palette"), cex=0.6, bty="n")   
        ani.pause() 
        },
           img.name="RandPopChange", htmlfile="SimPopChange.html",
           single.opts = "'controls': ['first', 'previous', 'play', 'next', 'last', 'loop', 'speed'], 'delayMin': 0",      
            description=c("Random population change:"))  

मैंने बहुभुज स्तंभों के आधार पर अधिक प्रासंगिक उदाहरण प्रदान करने के लिए पोस्ट को संपादित किया।


धन्यवाद, हालाँकि, यह पहली चीज़ है जो मैंने वास्तव में की थी, इस प्रश्न की खोज शुरू करते हुए, हालाँकि इसने मुझे परिणाम नहीं दिया क्योंकि मैं समझ नहीं पाया कि किस तर्क के रूप में अभिव्यक्ति होनी चाहिए।
रुविन रफाइलोव

ओह, मुझे लगता है कि यह उचित है, डेटा की तैयारी के साथ समाप्त होते ही अपनी आवश्यकताओं के लिए अनुकूलन करने का प्रयास करेंगे। बहुत बहुत धन्यवाद, जैसे ही यह काम करता है मैं एक जवाब स्वीकार करूंगा। और बस सवाल जो तुरंत उठता है: क्या प्लॉट के बजाय यहां spplot का उपयोग करना संभव है, क्या आपने कोशिश नहीं की है?
रविन रफैलोव

मैंने आपके कोड के बारे में अपने विचारों को दिखाने के लिए मुख्य प्रश्न को संपादित किया है, लेकिन मुझे यकीन है कि मैंने कई गलतियाँ की हैं क्योंकि यह ठीक से काम नहीं करता है। क्या आप इससे मेरी सहायता कर सकते हैं?
रुविन रफाइलोव

7

आपके द्वारा लिंक किया गया एनीमेशन (नीचे) एक एनिमेटेड GIF छवि है

यहां छवि विवरण दर्ज करें

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

एनीमेशन बनाने के लिए आपको क्या करना होगा:

1) प्रत्येक व्यक्ति 'फ्रेम' बनाएं जो दिखाया जाएगा।

2) खुद ही GIF बनाएं। कई वेबसाइटें हैं जो आपके लिए ऐसा करेंगी:

http://www.createagif.net/

http://makeagif.com/

इनमें से अधिकांश वेबसाइटें आपको एनीमेशन के आकार और गति को नियंत्रित करने की अनुमति देंगी।

StackOverflow सवाल आप से जुड़ा हुआ सब कुछ आप आप पहली बार एक 3 पार्टी पैकेज स्थापित करने के लिए है कि आर सूचना में इस कार्य को करने जानने की जरूरत के साथ आप प्रदान करना चाहिए।

EDIT : नीचे दिए गए StackOverflow लिंक से कोड का एक अद्यतन संस्करण है, क्योंकि इसमें थोड़ा भ्रम की स्थिति प्रतीत होती है।

jpeg("/tmp/foo%02d.jpg")
for (i in 1:5) {
  my.plot(i)
}      
make.mov <- function(){
     unlink("plot.mpg")
     system("convert -delay 0.5 plot*.jpg plot.mpg")
}

dev.off()

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


धन्यवाद, लेकिन मुझे एक तरह की अन्य वेबसाइटों के बिना आर के अंदर किए जाने के लिए एनीमेशन की आवश्यकता है और मुझे वास्तव में समझ में नहीं आता है कि स्टॉकओवरफ्लो में यह कोड और विचार कैसे काम करता है, अन्यथा मैं भी नहीं पूछता
रूविन रफैलोव

मुझे लगता है कि स्टैक एक्सचेंज का उत्तर थोड़ा भ्रमित हो सकता है क्योंकि उत्तर ने पाठ के ब्लॉक के साथ कोड को तोड़ दिया। मैं उस कोड के अपडेटेड संस्करण के साथ अपना उत्तर संपादित करूंगा।
रडार

अपडेट के लिए धन्यवाद, लेकिन अभी भी कई समस्याएं हैं, जो बेवकूफ और आसान हो सकती हैं, लेकिन दुर्भाग्य से मुझे उन्हें प्रबंधित करने का कोई अनुभव नहीं है। अगर आपको कोई आपत्ति नहीं है तो मैं पूछूंगा: 1) इस कोड में jpeg (...) का क्या अर्थ है? के रूप में Rstudio फ़ाइल को खोलने की एक गलती देता है 2) Rstudio my.plot फ़ंक्शन के गैर-अस्तित्व के बारे में बताता है, हालांकि यहां लगा सब कुछ स्थापित है। हो सकता है कि यह मैं ही हो जो गलत तरीके से काम कर रहा हो, अगर आप कुछ सलाह दे सकें। अग्रिम में धन्यवाद।
रुविन रफाइलोव

2

यहाँ जवाब है, ऑस्कर पेरिआन का धन्यवाद।

library(sp)
library(rgdal)
library(spacetime)
library(animation)
rus <- url("http://www.filefactory.com/file/4h1hb5c1cw7r/n/RUS_adm1_RData")
load(rus)
proj4.str <- CRS("+init=epsg:3413 +lon_0=105")
gadm.prj <- spTransform(gadm, proj4.str)
N <- nrow(gadm.prj)
pols <- geometry(gadm.prj)
nms<-gadm$NAME_1
vals1  <- read.csv2("C:\\unempl11.txt")
ord1 <- match(nms, vals1$region)
vals1 <- vals1[ord1,]

vals2 <- read.csv2("C:\\unempl12.txt")
ord2 <- match(nms, vals2$region)
vals2 <- vals2[ord2,]

nDays <- 2
tt <- seq(as.Date('2011-01-01'), by='year', length=nDays)
vals <- data.frame(unempl=rbind(vals1, vals2)[,-1])

gadmST <- STFDF(pols, time=tt, data=vals)



stplot(gadmST, animate=1, do.repeat=FALSE)

saveHTML(stplot(gadmST, animate=1, do.repeat=FALSE)
, img.name = "unemplan",  htmlfile = "unan.html")

ओह, मुझे स्पेसटाइम लाइब्रेरी का उपयोग पसंद है!
जेफरी इवांस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.