R中的动画地图


9

每个人,都为造成的困扰感到抱歉,但是我刚接触R时遇到了一个非常困难的问题:我想创建一张动画的Russin地图,例如失业率随不同年份的变化。在图像上,您可以看到一年的数据在此处输入图片说明

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/ 但是,我在Google上搜索了很多,阅读了许多主题在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")

这是能够重现代码的数据


重新编辑:代码出了什么问题?
ub

由于您的示例不可复制,因此很难进行故障排除。跳出了几件事1)您正在循环中应用空间变换,因此您要重复执行2)创建一个名为“ try”的对象,它也是R函数3)您可以迭代实际的列名,即。,for(i在c(“ Var1”,“ Var2”))中的当前编码方式非常复杂4)您对spplot的调用不正确,您正在将其传递给一个无意义的向量。
Jeffrey Evans

真是令我感到很抱歉,但这是我对R的首次实际体验,我在主要问题中添加了数据,如果不打扰您,请您提出改善方法,因为我真的各种想法
Ruvin Rafailov

Answers:


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数据,而不是随机给出,是否不进行故障排除?
鲁文·拉菲洛夫

是的,该代码仅与创建示例数据相关联。您将要使用自己的数据。
杰弗里·埃文斯

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

我编辑了这篇文章,以基于多边形列提供了一个更相关的示例。


谢谢,但是,这实际上是我做的第一件事,开始探讨这个问题,但是由于我不明白应该将哪个表达式作为参数,所以它没有给我结果。
鲁文·拉菲洛夫

哦,我认为这是适当的,将在完成数据准备后立即尝试针对我的需求进行优化。非常感谢您,一旦它起作用,我将接受答复。随即出现的问题是:是否可以在此处使用spplot代替plot,您是否尝试过?
鲁文·拉菲洛夫

我已经编辑了一个主要问题,以展示我对您的代码的想法,但是我确信我犯了很多错误,因为它无法正常工作。你能帮忙吗?
鲁文·拉菲洛夫

7

您链接的动画(如下)是GIF动画图像

在此处输入图片说明

本质上是循环播放的一系列图像,从而创建动画效果。可以将其想象为单击一系列幻灯片,大约每秒一次。

要创建动画,您需要做的是:

1)创建将要显示的每个单独的“框架”。

2)创建GIF本身。有几个网站可以为您做到这一点:

http://www.createagif.net/

http://makeagif.com/

这些网站中的大多数将允许您控制动画的大小和速度。

链接到StackOverflow问题应该为您提供在R中执行此任务所需的一切知识。请注意,您必须首先安装第3方软件包。

编辑:由于似乎有些混乱,下面是来自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中完成动画而没有其他网站,而且我真的不明白在股票溢价中此代码和想法是如何工作的,否则,我什
Ruvin Rafailov

我认为堆栈交换答案可能有点混乱,因为答案将代码与一段文本分开。我将使用该代码的更新版本来编辑答案。
雷达

感谢您的更新,但仍然存在许多问题,这些问题可能很愚蠢且容易实现,但是很遗憾,我没有管理这些问题的经验。如果您不介意,我会问:1)jpeg(...)在此代码中是什么意思?由于Rstudio出现无法打开文件的错误2)Rstudio告知my.plot函数不存在,尽管此处列出的所有内容均已安装。可能是我操作不正确,如果可以的话,请给我一些建议。提前致谢。
Ruvin Rafailov

2

是答案,这要感谢OscarPerpiñá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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.