Ответ 1
У меня есть пример, основанный на вашем, который работает с использованием knitr в Windows 8.1 в RStudio 0.99.441.
Это создает 40-кадровую анимацию графика. Он использует встроенный hook_plot_custom
для включения графиков, которые генерируются вручную, анимируя 3D-график. Код анимации был основан на справочниках и источниках play3d
и movie3d
. movied3d
сам не может быть использован, потому что он слишком негибкий в своем имени файла.
Я поставил это на github на https://github.com/NikNakk/testAnimateRgl/. 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}
Изменить: Новая версия
Здесь другая версия, которая демонстрирует использование пользовательских параметров chunk для установки параметров для более простого spin3d
. Обратите внимание, что с этой версией кусок представляет собой только одну строку (график scatter3d
). spin3d.axis
используется для установки параметра оси на spin3d
; spin3d.rpm
используется для установки параметра rpm
. Количество изображений и интервал между изображениями устанавливаются с использованием стандартных параметров fig.num
и interval
.
\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}