carte animée en R

9

tout le monde, désolé pour le dérangement, mais je suis tout à fait nouveau avec r face à une difficulté cruciale: je veux créer une carte animée de Russin avec des changements de chômage avec différentes années, comme. Sur l'image, vous pouvez voir les données d'un anentrez la description de l'image ici

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

Le résultat que je souhaite obtenir est quelque chose comme une animation ici: http://spatial.ly/2011/02/mapping-londons-population-change-2011-2030/ Cependant, j'ai beaucoup cherché sur Google, lu un certain nombre de thèmes dans http://stackoverflow.com, y compris les éléments suivants: Création d'un film à partir d'une série de tracés dans R , mais ne pouvait toujours pas faire la bonne chose.

Merci d'avance!

Je suis venu avec quelque chose comme ça, quelqu'un peut-il me dire où est l'erreur:

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

Voici les données pour pouvoir reproduire le code

Ruvin Rafailov
la source
Re The edit: qu'est-ce qui ne va pas avec le code?
whuber
Étant donné que votre exemple n'est pas reproductible, il est difficile à résoudre. Quelques choses sautent aux yeux 1) vous appliquez une transformation spatiale dans une boucle, vous le faites donc à plusieurs reprises 2) vous créez un objet appelé "try" qui est également une fonction R 3) vous pouvez parcourir les noms de colonnes réels, c.-à-d. ., pour (i en c ("Var1", "Var2")) la façon dont vous le codez actuellement est très compliquée 4) votre appel à spplot n'est pas correct, vous lui passez un vecteur absurde.
Jeffrey Evans
Je suis vraiment désolé d'être si incompréhensible, mais c'est ma première vraie expérience avec R, j'ai ajouté les données dans la question principale, si cela ne vous dérange pas, pouvez-vous suggérer des moyens d'amélioration comme je l'ai vraiment a manqué d'idées
Ruvin Rafailov

Réponses:

4

C'est aussi loin que je vais. Vous devriez pouvoir le comprendre à partir de ce code. Encore une fois, comme votre problème n'est pas reproductible, j'ai dû créer des données factices pour illustrer la solution. Un aspect étrange de l'utilisation de spplot est que, puisqu'il utilise un treillis pour créer le tracé, vous devez créer un objet, puis imprimer l'objet. Sinon, vous n'obtenez pas d'intrigue.

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")
Jeffrey Evans
la source
Je vous remercie! Je vais l'essayer immédiatement. Juste une question gadm @ data $ uemp2001 <- gadm @ data $ uemp2000 + (gadm @ data $ uemp2000 * 0.10) puis-je ici charger des données txt au lieu de données aléatoires, aucun dépannage n'aura lieu?
Ruvin Rafailov
Oui, ce code est simplement associé à la création d'exemples de données. Vous souhaitez utiliser vos propres données.
Jeffrey Evans
9

Jetez un œil au package d' animation . L'une des fonctions à explorer, qui ne nécessite pas de logiciel tiers, est "saveHTML".

L'utilisation de la fonction "saveHTML" dans le package d'animation est très simple. Voici un exemple de code où je crée une animation d'un changement de population aléatoire. L'argument "expr" définit la fonction de traçage que vous souhaitez transmettre à l'animation. Comme vous pouvez le voir dans le code ci-dessous, j'ai utilisé une boucle for pour tracer chaque colonne simulée.

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

J'ai édité le post pour fournir un exemple plus pertinent basé sur des colonnes de polygones.

Jeffrey Evans
la source
Merci, cependant, c'est la première chose que j'ai réellement faite, en commençant à explorer cette question, mais cela ne m'a pas donné le résultat car je ne pouvais pas comprendre quelle expression devait être un argument.
Ruvin Rafailov
Oh, je pense que c'est approprié, j'essaierai d'optimiser mes besoins dès que la préparation des données sera terminée. Merci beaucoup, dès que cela fonctionnera, j'accepterai une réponse. Et juste la question qui se pose immédiatement: est-il possible d'utiliser spplot ici au lieu de plot, n'avez-vous pas essayé?
Ruvin Rafailov
J'ai édité la question principale pour montrer mes idées concernant votre code, mais je suis sûr que j'ai fait un certain nombre d'erreurs car il ne fonctionne pas correctement. Pouvez-vous m'aider?
Ruvin Rafailov
7

L'animation que vous avez liée (ci-dessous) est une image GIF animée .

entrez la description de l'image ici

C'est essentiellement une série d'images qui sont parcourues, ce qui crée l'effet d'animation. Pensez-y comme en cliquant sur une série de diapositives, une par seconde environ.

Ce que vous devez faire pour créer l'animation est:

1) Créez chaque «cadre» individuel qui sera affiché.

2) Créez le GIF lui-même. Il existe plusieurs sites Web qui le feront pour vous:

http://www.createagif.net/

http://makeagif.com/

La plupart de ces sites Web vous permettront de contrôler la taille et la vitesse de l'animation.

La question StackOverflow à laquelle vous avez lié devrait vous fournir tout ce que vous devez savoir pour effectuer cette tâche dans R. Notez que vous devez d'abord installer un package tiers.

EDIT : Ci-dessous est une version mise à jour du code du lien StackOverflow ci-dessus car il semble y avoir un peu de confusion.

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

Ce code ci-dessus prend chacun des tracés individuels que vous avez créés dans R et les convertit en une animation en bouclant sur chacun d'eux et en utilisant ImageMagick , que vous devez avoir installé.

Radar
la source
Merci, mais je suis en quelque sorte un besoin d'animation à faire à l'intérieur de R sans d'autres sites Web et je ne comprends vraiment pas comment fonctionne ce code et cette idée sur stockoverflow, sinon je ne demanderais même pas
Ruvin Rafailov
Je pense que la réponse d'échange de pile peut être un peu déroutante car la réponse a brisé le code avec un bloc de texte. Je vais modifier ma réponse avec une version mise à jour de ce code.
Radar
Merci pour la mise à jour, mais il y a encore un certain nombre de problèmes, qui peuvent être stupides et faciles, mais malheureusement je n'ai aucune expérience dans leur gestion. Si cela ne vous dérange pas, je vais demander: 1) Que signifie jpeg (...) dans ce code? comme Rstudio donne une erreur de ne pas pouvoir ouvrir le fichier 2) Rstudio parle de la non-existence de la fonction my.plot, bien que tout ce qui est décrit ici soit installé. C'est peut-être moi qui opère à tort, si vous le pouvez, veuillez donner quelques conseils. Merci d'avance.
Ruvin Rafailov
2

Voici la réponse, grâce à Oscar 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")
Ruvin Rafailov
la source
Ooh, j'aime l'utilisation de la bibliothèque d'espace-temps!
Jeffrey Evans