我想使用knitr包和chunk选项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
上的循环?或者其他一些在beamer / knitr中叠加图的方法?如果是,我的代码如何修改以实现这一目标?
答案 0 :(得分:4)
如图形手册所述,仅记录来自高级绘图命令(例如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])
}
是的,这看起来像是对资源的严重浪费,而且#34;自然&#34;方法应该像你一样逐个添加点,而不是打开一个新的绘图并从1
到i
绘制点,但是没有办法检测单个R中的低级图形变化表达