2011-03-22 9 views
5

Antecedentes: Estoy tratando de animar un diagrama de dispersión en 3D giratorio utilizando la función R de Lattice :: cloud(). Creo una secuencia de imágenes PNG en R, luego creo un GIF animado de la secuencia.¿Cómo conservar la escala del gráfico de dispersión en la nube del enrejado rotado?

El problema es que la escala de la trama cambia con la rotación por lo que el cubo animado parece crecer y reducirse a medida que gira.

Aquí hay un ejemplo usando sólo dos parcelas (en base a uno de los ejemplos de la nube):

library(lattice) 
par.set <- 
    list(axis.line = list(col = "transparent"), 
    clip = list(panel = "off")) 

print(cloud(Sepal.Length ~ Petal.Length * Petal.Width, 
    data = iris, cex = .8, 
    groups = Species, 
    screen = list(z = 0, x = 0, y = 0), 
    par.settings = par.set, 
    scales = list(col = "black")), 
    split = c(1,1,2,1), more = TRUE) 
print(cloud(Sepal.Length ~ Petal.Length * Petal.Width, 
    data = iris, cex = .8, 
    groups = Species, 
    screen = list(z = 0, x = 0, y = 30), 
    par.settings = par.set, 
    scales = list(col = "black")), 
    split = c(2,1,2,1)) 

Me gustaría que la trama de la derecha a aparecer el mismo tamaño que la trama de la izquierda. En este ejemplo, es bastante más pequeño. No tengo que usar R o lattice :: cloud(), pero está muy cerca de lo que quiero ...

Probando rgl, parece que mi copia de rgl no es compatible con mi versión de R. voy a actualizar R cuando tengo un minuto:

> library(rgl) 
> df <- data.frame(x=runif(10,0,1), y=runif(10,0,1), z=runif(10,0,1), color=round(runif(10,1,3))) 
> plot3d(df$x, df$y, df$z, col=df$color, size=2, type='s') 
> rgl.snapshot("C:\\pic.png", fmt="png", top=TRUE) 
[1] "failed" 
Warning messages: 
1: In rgl.snapshot("C:\\pic.png", fmt = "png", top = TRUE) : 
    RGL: PNG Pixmap Saver Warning: Application was compiled with png.h from libpng-1.2.40 
2: In rgl.snapshot("C:\\pic.png", fmt = "png", top = TRUE) : 
    RGL: PNG Pixmap Saver Warning: Application is running with png.c from libpng-1.4.1 
3: In rgl.snapshot("C:\\pic.png", fmt = "png", top = TRUE) : 
    RGL: PNG Pixmap Saver Warning: Incompatible libpng version in application and library 

> sessionInfo() 
R version 2.11.1 (2010-05-31) 
i386-pc-mingw32 

locale: 
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252 LC_MONETARY=English_United States.1252 
[4] LC_NUMERIC=C       LC_TIME=English_United States.1252  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] rgl_0.92.798 

loaded via a namespace (and not attached): 
[1] tools_2.11.1 

he actualizado a 2.12.2 R y ahora esto funciona (usando GraphicsMagick en lugar de ImageMagick):

open3d() 
with(iris, plot3d(Petal.Length, Petal.Width, Sepal.Length, col=Species)) 
movie3d(spin3d(), duration=12, dir="C:\\Movie", convert=FALSE) 
system('"C:\\program files\\graphicsmagick-1.3.7-q8\\gm.exe" convert -delay 12 C:\\Movie\\movie*.png C:\\Movie\\animate.gif') 

Respuesta

3

Prueba el paquete de RGL, este es como me acerqué al mismo phenomea

require ("rgl") 

df <- data.frame(x=runif(10,0,1), y=runif(10,0,1), z=runif(10,0,1), color=round(runif(10,1,3))) 

plot3d(df$x, df$y, df$z, col=df$color, size=2, type='s') 

?movie3d() 

demo(flag) 

test <- spin3d(rpm=6,axis=c(0,0,1)) 
?spin3d 

open3d() 
plot3d(oh3d(col="lightblue", alpha=0.5)) 
play3d(spin3d(axis=c(0,0,1), rpm=20), duration=3) 


open3d() 
plot3d(cube3d(col="green")) 
M <- par3d("userMatrix") 
play3d(par3dinterp(userMatrix=list(M, 
           rotate3d(M, pi/2, 1, 0, 0), 
           rotate3d(M, pi/2, 0, 1, 0))), 
    duration=4) 

movie3d(spin3d(), duration=5) 

Mi información de sesión para un ejemplo de trabajo confirmado.

R version 2.12.2 (2011-02-25) 
Platform: i386-pc-mingw32/i386 (32-bit) 

locale: 
[1] LC_COLLATE=English_United States.1252 
[2] LC_CTYPE=English_United States.1252 
[3] LC_MONETARY=English_United States.1252 
[4] LC_NUMERIC=C       
[5] LC_TIME=English_United States.1252  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] rgl_0.92.798 

loaded via a namespace (and not attached): 
[1] tools_2.12.2 
+0

@OneWhoIsUnnamed Parece prometedor, pero por alguna razón movie3d() no puede crear los archivos de salida. Crea archivos png vacíos para cada cuadro y registra un error como 'Escritura movie115.png [1]" failed "'. –

+0

También plot3d() no parece tener el mismo nivel de control sobre apariencia que cloud(). ¿Cómo puedo cambiar el tamaño predeterminado de la ventana y el tamaño de las etiquetas de los ejes? ¡Gracias! –

+0

@Kent Johnson No estoy seguro de por qué movie3d() falla para usted, lo anterior funciona sin error en mi máquina, pero concedido no es exactamente lo que estaba buscando sino un ejemplo ilustrativo. Para solucionar problemas, ¿puede publicar el resultado de sessionInfo()? Tal vez este es un problema de versión R. ¿También es posible publicar un ejemplo de comando mínimo que utilizó para obtener este error? Sería útil para mí tratar de replicar este error. –

Cuestiones relacionadas