2013-08-05 65 views
1

随着R,我使用rgl包的persp3d函数来获得一个很好的3D图。旋转persp3d图并将图像保存为PNG

现在我想旋转persp3d函数,并将每个小的旋转图像保存为一个PNG文件。然后,我想要将命令animategraphic包含在我的乳胶演示文稿中。

因此我想要aks,我该如何做到这一点?

我需要他们,我可以在乳胶实现它们的方式,所以PNG文件的名称应该以某种方式像A1,A2等等...

我的代码来创建persp3d情节:

persp3d(x, y, z, theta=50, phi=25, expand=0.75, col=color[zcol2], 
     ticktype="detailed", xlab="", ylab="", zlab="",axes=FALSE) 

然后我试图与spin3d命令旋转它:

spind3d(rpm=3) 

不工作。这也不能拯救我的驱动器的PNG?

+0

我还试图play3d(spin3d(RPM = 1 ),持续时间= 10),但它不工作既不保存到我的驱动器? –

+0

我也知道关于movie3d()但命令也不起作用?嗯,我很困惑,为什么这不起作用?还有一个问题:我如何在与我的R系统具有相同旋转速度的LaTex中实现这一点? –

+0

*叹*在这种情况下,地球上的“不起作用”是什么意思?错误讯息?没有创建?屏幕上的大黑色方块?你需要更清楚。此外,让您的示例可重现... – Spacedman

回答

5

以下是使用功能spin3d更改视图的替代方法,以及movie3d以保存图像。

library(rgl) 
x <- seq(-10, 10, length= 30) 
y <- x 
f <- function(x,y) { r <- sqrt(x^2+y^2); 10 * sin(r)/r } 
z <- outer(x, y, f) 
z[is.na(z)] <- 1 
persp3d(x,y,z,theta=0,phi=25, col = "lightblue", 
     ticktype="detailed", xlab="", ylab="", zlab="",axes=FALSE) 
movie3d(spin3d(axis = c(0,0,1), rpm = 10), duration=6, type = "png") 

注意,默认情况movie3d节省由tempdir()设置文件夹中的文件。

4
x=1:10 
y=1:10 
z=matrix(runif(100),10,10) 
persp3d(x,y,z,theta=50,phi=25) 

然后遍历THETA或披,使用view3d设置角度,snapshot3d做出PNG

theta = seq(0,360,len=10) 
for(i in 1:10){ 
snapshot3d(file=paste0("spin-",i,".png")) 
view3d(theta=theta[i]) 
} 

你可能要循环披代替THETA。无论如何,这会让你获得你想要的PNG,不是吗?

+0

+1,但不是一个更“先进”的预先实现的功能,而不是蛮力循环解决方案?但无论如何谢谢,如果没有更好的答案,我会接受它! –

+3

如果你说'movie3d不工作'和'spind3d不工作'而没有告诉我们究竟如何,那么我会假设他们不工作,做出一些事情! – Spacedman

2

可能有人需要。我用于persp3Drgl以下组合:

userMat = matrix(data = c(0.4892255, 0.8709987, 0.04464279, 0, 
         -0.5228708, 0.2519508, 0.81430787, 0, 
         0.6980215, -0.4217298, 0.57868713, 0, 
         0.0000000, 0.0000000, 0.0000000, 1 
         ), nrow = 4, ncol = 4) 

persp3Drgl(..., userMatrix = userMat) 
par3d(windowRect=c(0,0,100,100)) 
snapshot3d(file.path(plotDir, "3D.png"), top = TRUE) 

此外,我用于跟踪userMatrix值(旋转后的曲线图通过鼠标)以下命令

userMat = par3d(no.readonly=TRUE)$userMatrix