Rのアニメーションマップ


9

皆さん、ご迷惑をおかけして申し訳ありませんが、私はrが非常に新しいことに直面しています。rは重大な困難に直面していました。画像では1年間のデータを見ることができますここに画像の説明を入力してください

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:以下を含むRにおける一連のプロットからムービーを作成、それでも正しいことを行うことができませんでした。

前もって感謝します!

私はこのようなものを思いついたのですが、誰が間違っているのか教えてもらえますか?

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)「try」と呼ばれるオブジェクトも作成しています。これは、R関数でもあります3)実際の列名を反復できます。 。、for(i in c( "Var1"、 "Var2"))現在コーディングされている方法は非常に複雑です4)spplotへの呼び出しが正しくありません。意味のないベクトルを渡しています。
ジェフリーエヴァンス

こんなに理解できなくて本当に申し訳ありませんが、これがRでの初めての本当の経験です。メインの質問にデータを追加しました。気にならない場合は、改善の方法を提案してくださいアイデアの実行
Ruvin Rafailov 2013

回答:


4

これは私が行くところです。このコードに基づいてそれを理解できるはずです。繰り返しになりますが、問題は再現できないため、ソリューションを説明するためにダミーデータを作成する必要がありました。spplotを使用する1つの奇妙な側面は、ラティスを使用してプロットを作成するため、オブジェクトを作成してからオブジェクトを印刷する必要があるということです。そうしないと、プロットが得られません。

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

ありがとうございました!すぐにやってみます。ただ1つの質問gadm @ data $ uemp2001 <-gadm @ data $ uemp2000 +(gadm @ data $ uemp2000 * 0.10)ここでは、ランダムに指定する代わりにtxtデータをロードできます。トラブルシューティングは行われませんか?
Ruvin Rafailov

はい、そのコードはサンプルデータの作成に関連付けられています。独自のデータを使用する必要があります。
ジェフリーエヴァンス

9

見てくださいアニメーションパッケージを。サードパーティのソフトウェアを必要としない、探索する価値のある機能の1つが「saveHTML」です。

アニメーションパッケージで「saveHTML」機能を使用するのは非常に簡単です。これは、ランダム化された人口変化のアニメーションを作成するコード例です。「expr」引数は、アニメーションに渡すプロット関数を定義します。以下のコードからわかるように、forループを使用して、シミュレートされた各列をプロットしました。

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

投稿を編集して、ポリゴン列に基づいたより適切な例を提供しました。


ありがとう、しかし、これは私が実際にやった最初のことで、この質問を探求し始めましたが、どの式が引数としてあるべきか理解できなかったので、結果は得られませんでした。
Ruvin Rafailov 2013

ああ、それは適切だと思います。データの準備が終わったらすぐに私のニーズに合わせて最適化しようとします。よろしくお願いいたします。うまくいき次第、お答えさせていただきます。そして、すぐに発生する質問:ここでは、plotの代わりにspplotを使用することは可能ですか?
Ruvin Rafailov 2013

私はあなたのコードに関する私の考えを示すために主な質問を編集しましたが、それが適切に機能しないので私は多くの間違いを犯したと確信しています。これについてお手伝いできますか?
Ruvin Rafailov 2013

7

リンクしたアニメーション(下)はアニメーションGIF画像です。

ここに画像の説明を入力してください

それは本質的に循環する一連の画像であり、アニメーション効果を作成します。一連のスライドを1秒ごとにクリックするようなものだと考えてください。

アニメーションを作成するために必要なことは次のとおりです。

1)表示される各「フレーム」を作成します。

2)GIF自体を作成します。これを行うWebサイトがいくつかあります。

http://www.createagif.net/

http://makeagif.com/

これらのWebサイトのほとんどでは、アニメーションのサイズと速度を制御できます。

あなたがにリンクされStackOverflowの質問は、あなたが最初のサードパーティのパッケージをインストールする必要があることに注意してくださいR.でこのタスクを実行するために知る必要があるすべてをあなたに提供する必要があります。

編集:少し混乱があるように見えるので、以下は上記の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を使用してアニメーションに変換します。


、ありがとう、私は他のウェブサイトなしRの内側に行われる種類のアニメーションの必要性を持っていると私は本当にstockoverflow作品で、どのようにこのコードや考えを理解していないそうでなければ、私はさえも求めるだろう
Ruvin Rafailov

スタック交換の回答は、コードがテキストのブロックで壊れているため、少しわかりにくいかもしれません。そのコードの更新されたバージョンで私の回答を編集します。
レーダー

更新ありがとうございます。まだ問題が多く、愚かで簡単な場合もありますが、残念ながら管理の経験はありません。よろしければ質問します。1)このコードでのjpeg(...)の意味は?Rstudioがファイルを開くことができないという間違いを出すので、2)Rstudioはmy.plot関数が存在しないことを通知しますが、ここで見つけたものはすべてインストールされています。誤動作しているのは私かもしれませんが、アドバイスをいただければ助かります。前もって感謝します。
Ruvin Rafailov 2013

2

ここで答えが、オスカーPerpiñánのおかげです。

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

ああ、私は時空ライブラリーの使用が好きです!
ジェフリーエヴァンス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.