R animasyonlu harita


9

Herkes, rahatsızlık için özür dilerim, ama çok önemli bir zorlukla karşı karşıya kaldım: Farklı yıllar boyunca işsizlik değişiklikleri ile birlikte hareketli bir Russin haritası oluşturmak istiyorum. Resimde bir yıllık verileri görebilirsinizresim açıklamasını buraya girin

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

Almak istediğim sonuç burada animasyon gibi bir şey: http://spatial.ly/2011/02/mapping-londons-population-change-2011-2030/ Ancak, çok fazla googled, bir dizi tema okudum içinde http://stackoverflow.com : aşağıdakileri içeren R Alanların bir Serisi Film oluşturma , ama yine de doğru olanı yapamadı.

şimdiden teşekkür ederim!

Böyle bir şeyle başa çıktım, kimse bana hatanın nerede olduğunu söyleyebilir mi?

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

İşte kodu yeniden üretebilmek için veriler


Re düzenleme: kod ile yanlış gidiyor?
whuber

Örneğiniz tekrar üretilemediğinden sorun gidermek zordur. Birkaç şey atlıyor 1) bir döngüde uzamsal bir dönüşüm uyguluyorsunuz, bu yüzden bunu tekrar tekrar yapıyorsunuz 2) "try" adında bir nesne oluşturuyorsunuz. ., (i in c ("Var1", "Var2")) için şu anda kodlanmış şekliniz çok kıvrıktır 4) spplot'a yaptığınız çağrı doğru değil, saçma bir vektör geçiriyorsunuz.
Jeffrey Evans

Anlamadığım için gerçekten üzgünüm, ama bu benim R ile ilk gerçek deneyimim, ana sorudaki verileri ekledim, eğer rahatsız etmiyorsan lütfen gerçekten iyileştirmenin yollarını öneririm Fikirler koştu
Ruvin Rafailov

Yanıtlar:


4

Bu benim kadar uzak. Bu kodu temel alarak çözebilmeniz gerekir. Bir kez daha, sorununuz yeniden üretilemediğinden çözümü göstermek için sahte veriler oluşturmak zorunda kaldım. Spplot kullanmanın garip bir yönü, çizimi oluşturmak için kafes kullandığından, bir nesne oluşturmanız ve ardından nesneyi yazdırmanızdır. Aksi takdirde arsa almazsınız.

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

Teşekkür ederim! Hemen deneyeceğim. Sadece bir soru gadm @ data $ uemp2001 <- gadm @ data $ uemp2000 + (gadm @ data $ uemp2000 * 0.10) Burada rastgele verilen yerine txt verileri yükleyebilir miyim, sorun giderme gerçekleşmeyecek mi?
Ruvin Rafailov

Evet, bu kod sadece örnek veri oluşturma ile ilişkilidir. Kendi verilerinizi kullanmak istersiniz.
Jeffrey Evans

9

Animasyon paketine bir göz atın . 3. taraf yazılım gerektirmeyen keşfetmeye değer işlevlerden biri "saveHTML" dir.

Animasyon paketinde "saveHTML" işlevini kullanmak çok basittir. Rastgele nüfus değişiminin bir animasyonunu oluşturduğum örnek kod. "İfade" bağımsız değişkeni, animasyona iletmek istediğiniz çizim işlevini tanımlar. Aşağıdaki kodda da görebileceğiniz gibi, her simüle edilmiş sütunu çizmek için bir for döngüsü kullandım.

    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:"))  

Çokgen sütunlarına dayanan daha alakalı bir örnek sunmak için yayını düzenledim.


Teşekkür ederim, Ancak, Bu soruyu keşfetmeye başlayarak yaptığım ilk şey, ancak hangi ifadenin bir argüman olarak olması gerektiğini anlayamadığım için bana sonuç vermedi.
Ruvin Rafailov

Oh, bunun uygun olduğunu düşünüyorum, veri hazırlama ile biter bitmez ihtiyaçlarım için optimize etmeye çalışacağım. Çok teşekkür ederim, işe başlar başlamaz bir cevap kabul edeceğim. Ve hemen ortaya çıkan soru: burada arsa yerine spplot kullanmak mümkün mü, denemediniz mi?
Ruvin Rafailov

Kodunuzla ilgili fikirlerimi göstermek için ana soruyu düzenledim, ancak düzgün çalışmadığı için bir takım hatalar yaptığımdan eminim. Bu konuda yardımcı olabilir misiniz?
Ruvin Rafailov

7

Bağladığınız animasyon (aşağıda) animasyonlu bir GIF görüntüsüdür .

resim açıklamasını buraya girin

Esasen, animasyon efektini yaratan bir dizi görüntüdür. Sanırım saniyede bir slayt dizisini tıklamak gibi düşünün.

Animasyonu oluşturmak için yapmanız gerekenler:

1) Gösterilecek her bir 'çerçeve' oluşturun.

2) GIF'in kendisini oluşturun. Bunu sizin için yapacak birkaç web sitesi vardır:

http://www.createagif.net/

http://makeagif.com/

Bu web sitelerinin çoğu, animasyonun boyutunu ve hızını kontrol etmenizi sağlar.

StackOverflow soru bağlantılı sen önce bir 3. parti paketini yüklemek zorunda olduğunu R. Bildiriminizde bu görevi gerçekleştirmek için bilmeniz gereken her şeyi size sunmalıdır.

DÜZENLEME : Aşağıda, StackOverflow bağlantısındaki kodun güncellenmiş bir sürümü var, çünkü biraz karışıklık var gibi görünüyor.

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

Yukarıdaki kod, R'de oluşturduğunuz her bir grafiği alır ve her birini döngülerek ve yüklemeniz gereken ImageMagick'i kullanarak bunları bir animasyona dönüştürür .


Teşekkür ederim, ama ben bir tür diğer web siteleri olmadan R içinde yapılacak bir animasyon ihtiyacım var ve gerçekten stockoverflow bu kod ve fikrin nasıl çalıştığını anlamıyorum, aksi takdirde ne de sormak istiyorum
Ruvin Rafailov

Ben cevap bir metin bloğu ile kod kırdı çünkü yığın değişim cevap biraz kafa karıştırıcı olabilir düşünüyorum. Cevabımı bu kodun güncellenmiş bir versiyonuyla düzenleyeceğim.
Radar

Güncelleme için teşekkürler, ancak hala aptal ve kolay olabilecek bazı sorunlar var, ancak ne yazık ki bunları yönetme konusunda hiçbir deneyimim yok. Sakıncası yoksa soracağım: 1) Bu kodda jpeg (...) ne anlama geliyor? Rstudio dosyayı açamayacağına dair bir hata verdiğinden 2) Rstudio burada belirtilen her şey yüklü olmasına rağmen, my.plot fonksiyonunun mevcut olmadığını anlatır. Belki yanlış çalışan kimsem olabilir, lütfen bir tavsiye verebilirseniz. Şimdiden teşekkürler.
Ruvin Rafailov

2

İşte cevap, Oscar Perpiñán sayesinde.

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

Ooh, uzay-zaman kütüphanesinin kullanımını seviyorum!
Jeffrey Evans
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.