我想使用knitr包和 block 选项fig.show='animate'
在beamer中创建一个动画,其中的数字被覆盖而不是被替换,类似于\multiinclude的工作方式默认。
一个最小的非工作示例如下(Rnw 文件),我希望将每个点逐一添加到动画中的现有绘图中。
\documentclass{beamer}
\usepackage{animate}
\begin{document}
\begin{frame}[fragile]
<<fig.show='animate', fig.width=5, fig.height=5, size='tiny', out.width='.8\\linewidth', fig.align='center', echo=FALSE>>=
x = 1:2
plot(x,x,type="n")
for (i in 1:length(x)) {
points(x[i],x[i])
}
@
\end{frame}
\end{document}
查看knitr graphics manual ,它指出绘图的两个来源是 plot.new()
和 grid.newpage()
,但有一个脚注可以查看 ?recordPlot
。因此,我尝试将 recordPlot()
放在 points
命令之后(并且还通过 par(bg=NA)
添加透明背景,但这确实不起作用,因为只创建了一个图。
一个最小的工作示例如下
\documentclass{beamer}
\usepackage{animate}
\begin{document}
\begin{frame}[fragile]
<<fig.show='animate', fig.width=5, fig.height=5, size='tiny', out.width='.8\\linewidth', fig.align='center', echo=FALSE, fig.keep='all'>>=
x = 1:2
plot(x,x,type="n")
for (i in 1:length(x)) {
for (j in 1:i) points(x[j],x[j])
}
@
\end{frame}
\end{document}
但这似乎有点矫枉过正,因为每个人物都重新绘制了情节和前面的所有要点。
有什么方法可以消除 j
上的循环吗?或其他一些方法来覆盖投影机/针织物中的绘图?如果是,如何修改我上面的代码才能实现这一点?
最佳答案
正如图形手册所解释的,仅记录来自高级绘图命令(例如 plot.new()
)的绘图和完整的表达式。这意味着,如果在 for 循环中存在多个低级绘图更改,这些更改将不会被一一记录,因为 for 循环中只有一个 R 表达式。这就是手册中图 4 所说明的内容。
如果要从 for 循环创建动画,循环中必须有高级绘图命令。手册中的图7就是这样的一个例子。
在您的情况下,您必须将 plot()
调用移至循环中:
x = 1:2
for (i in 1:length(x)) {
plot(x, x, type = "n")
points(x[1:i], x[1:i])
}
是的,这看起来是一种严重的资源浪费,“自然”的方式应该是像你一样逐个添加点,而不是打开一个新的绘图并从 1
绘制点到i
,但无法检测单个 R 表达式内的低级图形变化。
关于r - 使用knitr在beamer中叠加动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22745872/