【问题标题】:How to preserve scale of rotated lattice cloud scatter plot?如何保持旋转格子云散点图的比例?
【发布时间】:2011-03-22 20:50:27
【问题描述】:

背景:我正在尝试使用 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')

【问题讨论】:

    标签: r animation lattice


    【解决方案1】:

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

    【讨论】:

    • @OneWhoIsUnnamed 这看起来很有希望,但由于某种原因,movie3d() 无法创建输出文件。它为每个帧创建空的 png 文件并记录一个错误,如 Writing movie115.png [1] "failed"
    • 另外,plot3d() 似乎没有与 cloud() 相同的外观控制级别。如何更改默认窗口大小和轴标签的大小?谢谢!
    • @Kent Johnson 我不知道为什么 movie3d() 对你来说失败了,上面的方法在我的机器上没有错误,但授予的并不是你想要的,而是一个说明性的例子。要排除故障,您能否发布 sessionInfo() 的输出?也许这是一个 R 版本的问题。是否可以发布一个用于获取此错误的最小命令示例?尝试复制此错误对我很有用。
    • @OneWho:我们中的一些人在使用 rgl 时遇到了问题。 stackoverflow.com/questions/4543272/…
    • 我已经发布了我的会话信息以作为确认示例。我认为这可以解决!让我们一起努力吧!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-06
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多