【问题标题】:Rotate persp3d plot and save images as png旋转 persp3d 绘图并将图像另存为 png
【发布时间】:2013-08-05 16:43:31
【问题描述】:

对于 R,我正在使用 rgl 包的 persp3d 函数来获得漂亮的 3d 绘图。

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

因此我想问,我该怎么做?

我需要它们以一种可以在乳胶中实现它们的方式,所以 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) 但它既不能保存到我的驱动器也不能工作?
  • 我也知道movie3d() 但该命令也不起作用?嗯,我很困惑为什么这不起作用?还有一个问题:如何在 LaTex 中实现与 R 系统相同的旋转速度?

标签: r data-visualization


【解决方案1】:

这里是使用函数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()设置的文件夹中。

【讨论】:

    【解决方案2】:
    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 但不是更“高级”的预实现功能而不是蛮力循环解决方案吗?但无论如何谢谢,如果没有更好的答案,我会接受!
    • 如果你说“movie3d 不工作”和“spind3d 不工作”而没有告诉我们具体是如何工作的,那么我将假设它们不工作并制作一些可以工作的东西!
    【解决方案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
    

    【讨论】:

    • 这很晚,但这非常有帮助,我很惊讶它没有那么多的赞成票。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    • 2019-07-17
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多