R의 애니메이션 맵


9

모두들, 방해해서 미안하지만, 저는 r과 함께 아주 새로운 것을 겪고 있습니다. 결정적인 어려움에 직면했습니다. 저는 같은 해에 실업률의 변화와 함께 Russin의 애니메이션 맵을 만들고 싶습니다. 이미지에서 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")

코드를 재생할 수있는 데이터는 다음과 같습니다.


Re 편집 : 코드에 어떤 문제가 있습니까?
whuber

예제를 재현 할 수 없으므로 문제를 해결하기가 어렵습니다. 몇 가지 중요한 점 1) 루프에서 공간 변환을 적용하고 있기 때문에 반복적으로 수행하고 있습니다. 2) R 함수 인 "try"라는 객체를 생성하고 있습니다. 3) 실제 열 이름을 반복 할 수 있습니다. ., for (i in c ( "Var1", "Var2")) 당신이 현재 그것을 코딩하는 방법은 매우 복잡합니다. 4) spplot에 대한 호출이 정확하지 않습니다.
Jeffrey Evans

이해가되지 않아서 정말 죄송합니다 .R에 대한 나의 첫 경험이며, 주요 질문에 데이터를 추가했습니다. 귀찮게하지 않을 경우 개선 방법을 제안하십시오. 아이디어를 만났 유타
Ruvin Rafailov

답변:


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

감사합니다! 나는 그것을 즉시 시도 할 것이다. 단 하나의 질문 gadm @ data $ uemp2001 <-gadm @ data $ uemp2000 + (gadm @ data $ uemp2000 * 0.10) 여기에서 임의의 데이터 대신에 txt 데이터를로드 할 수 있습니까?
Ruvin Rafailov 2016 년

예, 해당 코드는 예제 데이터 생성과 관련이 있습니다. 자신의 데이터를 사용하고 싶을 것입니다.
Jeffrey Evans

9

애니메이션 패키지를 살펴보십시오 . 타사 소프트웨어가 필요하지 않은 탐색 할 가치가있는 기능 중 하나는 "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

오, 나는 그것이 적절하다고 생각합니다. 데이터 준비가 끝나 자마자 내 요구에 맞게 최적화하려고 노력할 것입니다. 작동하는 즉시 답변을 수락하겠습니다. 그리고 바로 발생하는 질문 : 음모 대신 spplot을 사용할 수 있습니까? 시도하지 않습니까?
Ruvin Rafailov

코드와 관련된 아이디어를 보여주기 위해 주요 질문을 편집했지만 제대로 작동하지 않아 여러 가지 실수를 저지른 것 같습니다. 도와 줄 수 있습니까?
Ruvin Rafailov 2016

7

연결 한 애니메이션 (아래)은 애니메이션 GIF 이미지 입니다.

여기에 이미지 설명을 입력하십시오

본질적으로 순환되는 일련의 이미지로 애니메이션 효과를 만듭니다. 매 순간마다 일련의 슬라이드를 클릭하는 것처럼 생각하십시오.

애니메이션을 만들려면 다음을 수행하십시오.

1) 표시 될 각각의 개별 '프레임'을 만듭니다.

2) GIF 자체를 만듭니다. 이를 위해 여러 웹 사이트가 있습니다.

http://www.createagif.net/

http://makeagif.com/

이러한 웹 사이트의 대부분을 통해 애니메이션의 크기와 속도를 제어 할 수 있습니다.

연결 한 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

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

시공간 라이브러리를 사용하는 것이 좋습니다!
Jeffrey Evans
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.