knitr로 애니메이션 된 rgl 그래프
를 통해 문서에 애니메이션 rgl
그래프 를 포함하고 싶습니다 . 내 MWE는 다음과 같습니다..Rnw
knitr
\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
.NET으로 애니메이션 그래프를 얻으려면 어떻게해야합니까 fig.path = 'figure/'
?
RStudio 0.99.441 내에서 Windows 8.1의 knitr를 사용하여 작동하는 예제가 있습니다.
그러면 플롯의 40 프레임 애니메이션이 생성됩니다. 내장을 사용하여 hook_plot_custom
3D 플롯을 애니메이션하여 수동으로 생성 된 플롯을 포함합니다. 애니메이션의 코드는 도움말 및의 소스들에 기반 play3d
하고 movie3d
. 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.width=5, fig.height=5, out.width='.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}
편집 : 새 버전
Here's another version which demonstrates the use of custom chunk options to set the parameters for the rather simpler spin3d
. Note that with this version, the chunk is just a single line (the scatter3d
plot). spin3d.axis
is used to set the axis parameter to spin3d
; spin3d.rpm
is used to set the rpm
parameter. The number of images and the interval between images is set using the standard fig.num
and interval
parameters.
\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.width=5, fig.height=5, out.width='.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}
참고URL : https://stackoverflow.com/questions/25202887/animated-rgl-graphs-with-knitr
'developer tip' 카테고리의 다른 글
XE2를 사용한 원격 디버깅-문자열 표시 (0) | 2020.12.13 |
---|---|
"아직 구현되지 않음"을 알리는 방법은 무엇입니까? (0) | 2020.12.13 |
iframe 콘텐츠 높이를 설정하여 동적으로 자동 크기 조정 (0) | 2020.12.13 |
Android AccountManager는 앱 / UID 단위로 OAuth 토큰을 저장하면 안 되나요? (0) | 2020.12.13 |
Sun의 javac에서 생성 된 이상한 예외 테이블 항목 (0) | 2020.12.13 |