animierte Karte in R.

9

Alle, entschuldigen Sie die Störung, aber ich bin ziemlich neu mit einer entscheidenden Schwierigkeit: Ich möchte eine animierte Karte von Russin mit Veränderungen der Arbeitslosigkeit mit unterschiedlichen Jahren erstellen, wie z. Auf dem Bild sehen Sie Daten für ein JahrGeben Sie hier die Bildbeschreibung ein

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

Das Ergebnis, das ich bereit bin zu bekommen, ist so etwas wie eine Animation hier: http://spatial.ly/2011/02/mapping-londons-population-change-2011-2030/ Ich habe jedoch viel gegoogelt und eine Reihe von Themen gelesen in http://stackoverflow.com, einschließlich der folgenden Informationen : Erstellen eines Films aus einer Reihe von Handlungen in R , aber immer noch nicht das Richtige.

Vielen Dank im Voraus!

Ich habe mir so etwas ausgedacht. Kann mir bitte jemand sagen, wo der Fehler liegt:

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

Hier sind Daten, um den Code reproduzieren zu können

Ruvin Rafailov
quelle
Betreff Die Bearbeitung: Was läuft mit dem Code falsch?
whuber
Da Ihr Beispiel nicht reproduzierbar ist, ist die Fehlerbehebung schwierig. Ein paar Dinge springen heraus 1) Sie wenden eine räumliche Transformation in einer Schleife an, also tun Sie dies wiederholt 2) Sie erstellen ein Objekt namens "try", das auch eine R-Funktion ist 3) Sie könnten durch tatsächliche Spaltennamen iterieren, d. H. ., für (i in c ("Var1", "Var2")) ist die Art und Weise, wie Sie es derzeit codiert haben, sehr kompliziert. 4) Ihr Aufruf von spplot ist nicht korrekt, Sie übergeben ihm einen Unsinnvektor.
Jeffrey Evans
Es tut mir wirklich leid, dass ich so ein Unverständnis habe, aber dies ist meine erste echte Erfahrung mit R überhaupt. Ich habe die Daten in der Hauptfrage hinzugefügt. Wenn es Sie nicht stört, können Sie bitte Verbesserungsmöglichkeiten vorschlagen, wie ich es wirklich bin lief von Ideen
Ruvin Rafailov

Antworten:

4

Das ist so weit wie ich gehe. Sie sollten es anhand dieses Codes herausfinden können. Da Ihr Problem nicht reproduzierbar ist, musste ich erneut Dummy-Daten erstellen, um die Lösung zu veranschaulichen. Ein seltsamer Aspekt bei der Verwendung von spplot ist, dass Sie ein Objekt erstellen und dann das Objekt drucken müssen, da es Gitter verwendet, um das Diagramm zu erstellen. Andernfalls erhalten Sie kein Grundstück.

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
quelle
Vielen Dank! Ich werde es sofort versuchen. Nur eine Frage gadm @ data $ uemp2001 <- gadm @ data $ uemp2000 + (gadm @ data $ uemp2000 * 0.10) Kann ich hier txt-Daten laden, anstatt sie zufällig anzugeben? Es findet keine Fehlerbehebung statt.
Ruvin Rafailov
Ja, dieser Code ist nur mit dem Erstellen von Beispieldaten verknüpft. Sie möchten Ihre eigenen Daten verwenden.
Jeffrey Evans
9

Schauen Sie sich das Animationspaket an. Eine der zu untersuchenden Funktionen, für die keine Software von Drittanbietern erforderlich ist, ist "saveHTML".

Die Verwendung der Funktion "saveHTML" im Animationspaket ist sehr einfach. Hier ist ein Beispielcode, in dem ich eine Animation einer zufälligen Populationsänderung erstelle. Das Argument "expr" definiert die Plotfunktion, die Sie an die Animation übergeben möchten. Wie Sie im folgenden Code sehen können, habe ich eine for-Schleife verwendet, um jede simulierte Spalte zu zeichnen.

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

Ich habe den Beitrag bearbeitet, um ein relevanteres Beispiel basierend auf Polygonspalten bereitzustellen.

Jeffrey Evans
quelle
Vielen Dank. Dies ist jedoch das erste, was ich tatsächlich getan habe, als ich anfing, diese Frage zu untersuchen. Es gab mir jedoch nicht das Ergebnis, da ich nicht verstehen konnte, welcher Ausdruck als Argument dienen sollte.
Ruvin Rafailov
Oh, ich denke das ist angemessen, werde versuchen, für meine Bedürfnisse zu optimieren, sobald die Datenvorbereitung abgeschlossen ist. Vielen Dank, sobald es funktioniert, werde ich eine Antwort akzeptieren. Und nur die Frage, die sich sofort stellt: Ist es möglich, hier spplot anstelle von plot zu verwenden, haben Sie es nicht versucht?
Ruvin Rafailov
Ich habe die Hauptfrage bearbeitet, um meine Ideen zu Ihrem Code zu zeigen, aber ich bin sicher, dass ich eine Reihe von Fehlern gemacht habe, da dies nicht richtig funktioniert. Können Sie dabei helfen?
Ruvin Rafailov
7

Die Animation, die Sie (unten) verlinkt haben, ist ein animiertes GIF-Bild .

Geben Sie hier die Bildbeschreibung ein

Es handelt sich im Wesentlichen um eine Reihe von Bildern, die durchlaufen werden, wodurch der Animationseffekt erzeugt wird. Stellen Sie sich vor, Sie klicken sich durch eine Reihe von Folien, eine pro Sekunde oder so.

Um die Animation zu erstellen, müssen Sie Folgendes tun:

1) Erstellen Sie jeden einzelnen 'Frame', der angezeigt wird.

2) Erstellen Sie das GIF selbst. Es gibt mehrere Websites, die dies für Sie tun:

http://www.createagif.net/

http://makeagif.com/

Auf den meisten dieser Websites können Sie die Größe und Geschwindigkeit der Animation steuern.

Die von Ihnen verknüpfte StackOverflow-Frage sollte Ihnen alles bieten, was Sie wissen müssen, um diese Aufgabe in R auszuführen. Beachten Sie, dass Sie zuerst ein Paket eines Drittanbieters installieren müssen.

BEARBEITEN : Unten finden Sie eine aktualisierte Version des Codes aus dem obigen StackOverflow-Link, da ein wenig Verwirrung zu herrschen scheint.

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

Dieser obige Code verwendet jedes der einzelnen Diagramme, die Sie in R erstellt haben, und konvertiert sie in eine Animation, indem Sie sie durchlaufen und ImageMagick verwenden , das Sie installiert haben müssen.

Radar
quelle
Vielen Dank, aber ich bin ein Kind, das Animationen in R ohne andere Websites erstellen muss, und ich verstehe wirklich nicht, wie dieser Code und diese Idee bei stockoverflow funktionieren, sonst würde ich nicht einmal fragen
Ruvin Rafailov
Ich denke, die Antwort auf den Stapelaustausch kann etwas verwirrend sein, da die Antwort den Code mit einem Textblock auseinander gebrochen hat. Ich werde meine Antwort mit einer aktualisierten Version dieses Codes bearbeiten.
Radar
Vielen Dank für das Update, aber es gibt immer noch eine Reihe von Problemen, die dumm und einfach sein können, aber leider habe ich keine Erfahrung mit der Verwaltung. Wenn es Ihnen nichts ausmacht, werde ich fragen: 1) Was bedeutet JPEG (...) in diesem Code? da Rstudio den Fehler macht, die Datei nicht öffnen zu können 2) Rstudio berichtet über das Nichtvorhandensein der Funktion my.plot, obwohl alles, was hier herausgefunden wurde, installiert ist. Vielleicht bin ich es, der falsch arbeitet, wenn Sie bitte einen Rat geben können. Danke im Voraus.
Ruvin Rafailov
2

Hier ist die Antwort dank 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
quelle
Oh, ich mag die Nutzung der Raumzeitbibliothek!
Jeffrey Evans