旋转persp3d图并将图像保存为png格式图片。

3

我正在使用R语言中的rgl包中的persp3d函数制作一个漂亮的三维图。现在,我想旋转persp3d函数,并将每个小的旋转图像保存为png文件。 我想用命令animategraphic将它们包含在我的latex演示文稿中。

因此,我想问如何做到这一点?我需要以一种可以在latex中实现的方式获取它们,因此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文件保存到我的驱动器中。


我也尝试了play3d(spin3d(rpm=1), duration=10),但它既不能工作,也不能保存到我的驱动器中? - Stat Tistician
我也知道movie3d(),但是这个命令也不起作用?嗯,我很困惑为什么它不起作用?还有一个问题:我该如何在LaTex中实现这个功能,使旋转速度与我的R系统相同? - Stat Tistician
3个回答

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或phi,使用view3d设置角度,使用snapshot3d制作PNG。
theta = seq(0,360,len=10)
for(i in 1:10){
 snapshot3d(file=paste0("spin-",i,".png"))
 view3d(theta=theta[i])
}

你可能希望循环遍历phi而不是theta。总之,这样可以得到你想要的PNG文件,对吧?

+1 但是有没有更“高级”的预实现函数而不是那种蛮力循环解决方案呢?无论如何,谢谢,如果没有更好的答案,我会接受它! - Stat Tistician
3
如果你只是说“电影三维不起作用”和“旋转三维不起作用”,却没有告诉我们具体的情况,那么我会假设它们确实无法工作,并且会制作出一个可以工作的东西! - Spacedman

3
也许有人需要。我在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

1
虽然来晚了,但这非常有帮助,我很惊讶它没有得到更多的赞。 - akenny430

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接