与knitr的动画rgl图表

 jiangzh 发布于 2022-12-29 11:01

我希望rgl在我的.Rnw文档中包含动画图表knitr.这是我的MWE:

\documentclass{article}

<< label = setup, include = FALSE>>=
opts_chunk$set(fig.path = 'figure/',  cache = FALSE, dev = "pdf",  fig.align = 'center', fig.show = 'hold', fig.width = 3, fig.height = 3,  echo = TRUE, warning = FALSE, message = FALSE, size = 'footnotesize', comment=NA, results='hold')

knit_hooks$set(par = function(before, options, envir){
if (before && options$fig.show!='none')
 par(mar = c(4, 4, 0.1, 0.1), cex.lab = 0.95, cex.axis = 0.9, mgp = c(2, 0.7, 0), tcl = -0.3)
}
)
knit_hooks$set(rgl = function(before, options, envir) {
  if (!before) {
    ## after a chunk has been evaluated
    if (rgl.cur() == 0) return()  # no active device
    name = paste(options$fig.path, options$label, sep = '')
    rgl.snapshot(paste(name, '.png', sep = ''), fmt = 'png')
    return(paste('\\includegraphics{', name, '}\n', sep = ''))
  }
}
)

options(replace.assign = TRUE, width = 60)
@ 
\begin{document}

<< label=packages >>=
library(car)
@
<< label=rgl1, rgl=TRUE, fig.show='animate' >>=
scatter3d(prestige ~ income + education, data=Duncan)
@

\end{document}

我没有在我的针织文件中得到图表.任何帮助将受到高度赞赏.谢谢

更新

我仍然无法使其工作并收到以下警告:

Warning messages:
1: In rgl.snapshot(paste(name, ".png", sep = ""), fmt = "png") :
  RGL: Pixmap save: unable to open file 'D:\A B\C D UAF\Test\knitr\rglAnimation\figure\rgl1.png' for writing
2: In rgl.snapshot(paste(name, ".png", sep = ""), fmt = "png") :
  snapshot failed
3: running command '"C:\PROGRA~2\MIKTEX~1.9\miktex\bin\x64\texi2dvi.exe" --quiet --pdf "rglAnimation.tex" --max-iterations=20 -I "C:/PROGRA~1/R/R-31~1.1/share/texmf/tex/latex" -I "C:/PROGRA~1/R/R-31~1.1/share/texmf/bibtex/bst"' had status 1 

我的sessionInfo()

R version 3.1.1 (2014-07-10)
Platform: x86_64-w64-mingw32/x64 (64-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] tools     stats     graphics  grDevices utils     datasets  methods  
[8] base     

other attached packages:
[1] mgcv_1.8-2    nlme_3.1-117  rgl_0.93.1098 car_2.0-21    knitr_1.6.15 

loaded via a namespace (and not attached):
[1] evaluate_0.5.5  formatR_1.0     grid_3.1.1      highr_0.3      
[5] lattice_0.20-29 MASS_7.3-34     Matrix_1.1-4    nnet_7.3-8     
[9] stringr_0.6.2  

编辑

更改fig.path = 'figure/'fig.path = ''opts_chunk$set编译与文档png图表但没有任何动画.如果有人指导我如何获得动画rgl图表,将非常感激fig.path = 'figure/'.谢谢

1 个回答
  • 我有一个基于你的例子,它在RStudio 0.99.441中使用Windows 8.1上的knitr工作.

    这会产生一个40帧的动画.它使用内置hook_plot_custom函数来包含通过动画3d绘图手动生成的图.动画的代码是基于那些在帮助和来源play3dmovie3d.movied3d本身不能使用,因为它的文件命名太不灵活.

    我已经把它放在了https://github.com/NikNakk/testAnimateRgl/上的github上.pdf位于https://github.com/NikNakk/testAnimateRgl/raw/master/rglKnitr.pdf

    \documentclass{article}
    \usepackage{animate}
    
    << label = setup, include = FALSE>>=
    library("rgl")
    library("car")
    library("knitr")
    knit_hooks$set(rgl = hook_plot_custom)
    @ 
    \begin{document}
    
    << label=rgl1, rgl=TRUE, fig.show='animate', fig..6\\linewidth', dev='png', fig.num = 40, interval=0.1>>=
    scatter3d(prestige ~ income + education, data=Duncan)
    M <- par3d("userMatrix")
    par3d(windowRect = 100 + opts_current$get("dpi") *
            c(0, 0, opts_current$get("fig.width"), 
            opts_current$get("fig.height")))
    spinFunc <- par3dinterp(userMatrix=list(M,
                                 rotate3d(M, pi/2, 1, 0, 0),
                                 rotate3d(M, pi/2, 0, 1, 0)))
    for(i in 1:40) {
      par3d(spinFunc(i / 10))
      Sys.sleep(0.05)
      rgl.snapshot(fig_path(".png", number = i), fmt = "png")
    }
    @
    
    \end{document}
    

    编辑:新版本

    这是另一个版本,它演示了如何使用自定义块选项来设置更简单的参数spin3d.请注意,对于此版本,块只是一行(scatter3d图).spin3d.axis用于将轴参数设置为spin3d; spin3d.rpm用于设置rpm参数.使用标准fig.numinterval参数设置图像数量和图像之间的间隔.

    \documentclass{article}
    \usepackage{animate}
    
    << label = setup, include = FALSE>>=
      library("rgl")
    library("car")
    library("knitr")
    hook_rgl_spin <- function(before, options, envir) {
      if (!before) {
        par3d(windowRect = 100 + options$dpi *
              c(0, 0, options$fig.width, 
                options$fig.height))
        if (!is.null(options$spin3d.axis)) {
          spin3d.axis <- options$spin3d.axis
        } else {
          spin3d.axis <- c(0, 0, 1)
        }
        if (!is.null(options$spin3d.rpm)) {
          spin3d.rpm <- options$spin3d.rpm
        } else {
          spin3d.rpm <- c(0, 0, 1)
        }
        spinFunc <- spin3d(axis = spin3d.axis, rpm = spin3d.rpm)
        for(i in 1:options$fig.num) {
          par3d(spinFunc(i * options$interval))
          Sys.sleep(0.05)
          rgl.snapshot(fig_path(".png", number = i), fmt = "png")
        }
    
        hook_plot_custom(before, options, envir)
      }
    }
    knit_hooks$set(rgl = hook_rgl_spin)
    @ 
      \begin{document}
    
    << label=rgl1, rgl=TRUE, fig.show='animate', fig..6\\linewidth', dev='png', fig.num = 40, interval=0.1, spin3d.axis=c(0, 0, 1), spin3d.rpm = 20>>=
      scatter3d(prestige ~ income + education, data=Duncan)
    @
    
      \end{document}
    

    2022-12-29 11:04 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有