r语言 - 使用 knitr 在 Beamer 中的叠加动画



我想使用 knitr 包和块选项在 beamer 中创建动画 fig.show='animate' 图形被叠加而不是替换,类似于 \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 图形手册来看,它指出情节的两个来源是 plot.new()grid.newpage() ,但有一个脚注可以看到?recordPlot。所以我尝试在 points 命令之后放置recordPlot()(并通过 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])
}

是的,这看起来像是对资源的严重浪费,"自然"的方式应该是像你一样一个接一个地添加点,而不是打开一个新的绘图并从1i绘制点,但是没有办法检测单个 R 表达式中的低级图形更改。

最新更新