5

背景:我正在尝试使用 R 的 lattice::cloud() 函数对旋转的 3D 散点图进行动画处理。我在 R 中创建了一个 PNG 图像序列,然后从该序列中创建一个动画 GIF。

问题是情节的比例随着旋转而变化,因此动画立方体看起来会随着旋转而增长和缩小。

这是一个仅使用两个图的示例(基于其中一个云示例):

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

我希望右侧图的大小与左侧图相同。在此示例中,它要小得多。我不必使用 R 或 lattice::cloud() 但它非常接近我想要的......

尝试 rgl,看起来我的 rgl 副本可能与我的 R 版本不兼容。我有时间会升级 R:

> 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

我更新到 R 2.12.2 现在可以正常工作了(使用 GraphicsMagick 而不是 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')
4

1 回答 1

3

试试 rgl 包,这就是我处理相同现象的方式

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 )

我确认的工作示例的会话信息。

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
于 2011-03-22T21:30:16.443 回答