2016-08-06 48 views
3

Ich habe ein Problem, das ich nicht lösen kann. Ich versuche eine Animation mit gganimate mit geom_contour zu erstellen. Wenn ich den Datenrahmen als einen einzelnen "Rahmen" plotte, funktioniert es ohne Probleme; Wenn ich jedoch die Ästhetik "Rahmen" hinzufüge und versuche, sie mit gganimate auszuführen, funktioniert geom_contour nicht. Ich bin mir nicht sicher, was passiert nach googlen, da es genau der gleiche Datenrahmen ist. Außerdem funktioniert es gut mit geom_raster. Ich habe ein sehr kleines Beispiel gegeben, das darstellt, was ich eigentlich versuche, wenn auch in einem kleineren Maßstab.geom_contour schlägt fehl in gganimate aber arbeitet in ggplot2

Jede Hilfe wäre willkommen. Vielen Dank!

library(mvtnorm) 
library(ggplot2) 
library(gganimate) 

generateLattice <- function(theta,offset,increment){ 
    dim1 <- c(seq(from=theta[1]-offset,to=theta[1]-increment,by=increment),seq(from=theta[1],to=theta[1]+offset,by=increment)) 
    dim2 <- c(seq(from=theta[2]-offset,to=theta[2]-increment,by=increment),seq(from=theta[2],to=theta[2]+offset,by=increment)) 
    lattice <- expand.grid(dim1,dim2) 
    return(lattice) 
} 

testLattice <- generateLattice(c(5,5),10,0.05) 
testPDF <- apply(testLattice,1,function(x){ 
    dmvnorm(x=x,mean=c(5.5,4.5),sigma=matrix(c(1,0.25,0.25,1),2,2)) 
}) 
testLattice$PDF <- testPDF 
testLattice$iter <- 1 

testLattice1 <- generateLattice(c(6,6),10,0.05) 
testPDF1 <- apply(testLattice1,1,function(x){ 
    dmvnorm(x=x,mean=c(5.0,4.75),sigma=matrix(c(0.9,0.15,0.15,1.2),2,2)) 
}) 
testLattice1$PDF <- testPDF 
testLattice1$iter <- 2 

testLatticeGIF <- rbind(testLattice,testLattice1) 

ggplot(testLatticeGIF[testLatticeGIF$iter==1,],aes(x=Var1,y=Var2,z=PDF)) + 
    geom_contour() 

#works 
p <- ggplot(testLatticeGIF,aes(x=Var1,y=Var2,fill=PDF,frame=iter)) + 
    geom_raster() 
gganimate::gg_animate(p) 

#fails 
p <- ggplot(testLatticeGIF,aes(x=Var1,y=Var2,z=PDF,frame=iter)) + 
    geom_contour() 
gganimate::gg_animate(p) 
+0

~~ Ich bin verwirrt - Sie haben 'frame' sowohl im Plot unter' # works' als auch in dem mit unde markierten Feld definiert r '# fails'. ~~ – rensa

+0

Nevermind ~ Lies deinen Beitrag neu. – rensa

Antwort

3

Der Grund ist einfach, dass geom_contour() kennt nicht die Daten in Form zu handhaben, dass man sie ihm übergeben. Die folgenden beiden Parzellen nicht beide arbeiten:

ggplot(testLatticeGIF,aes(x=Var1,y=Var2,z=PDF)) + 
    geom_contour() 
## Warning message: 
## Computation failed in `stat_contour()`: 
## dimensions of 'x', 'y' and 'z' do not match 
ggplot(testLatticeGIF,aes(x=Var1,y=Var2,z=PDF,colour=iter)) + 
    geom_contour() 
## Warning message: 
## Computation failed in `stat_contour()`: 
## dimensions of 'x', 'y' and 'z' do not match 

ich es oft hilfreich zu verwenden, sagen wir, colour statt frame. Wenn dies nicht funktioniert, ist es ein starker Hinweis, dass das Problem nicht mit gganimate ist. Hier ist das Problem, dass Sie die group Ästhetik so verwenden müssen, dass geom_contour weiß, welche Datenpunkte gehören zusammen:

ggplot(testLatticeGIF,aes(x=Var1,y=Var2,z=PDF,group=iter,colour=iter)) + 
    geom_contour() 

enter image description here

Und jetzt funktioniert es auch mit der Animation:

p <- ggplot(testLatticeGIF,aes(x=Var1,y=Var2,z=PDF,group=iter,frame=iter)) + 
     geom_contour() 
gganimate::gg_animate(p) 

enter image description here

+1

Vielen Dank für Ihre Frage @Stibu! Ich habe am Ende Base-Grafiken verwendet, um zu tun, was ich wollte (http://i.imgur.com/XoYfbD2.gifv für das Ergebnis), aber ich werde es mit ggplot2 ausprobieren. – slwu89