【问题标题】:overlayed animations in beamer using knitr使用knitr在投影仪中叠加动画
【发布时间】:2014-05-09 20:45:55
【问题描述】:

我想使用 knitr 包和块选项 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 上的循环吗?或以其他方式覆盖投影仪/编织器中的绘图?如果是,如何修改我上面的代码以实现这一点?

【问题讨论】:

  • 这是一个很好的建议,我没有尝试过。包括fig.keep='all' 允许我简化最小的工作示例(我已经更新),但在非工作示例中,它只提供两个图:一个没有点,一个有所有点,而不是添加一系列图由于 R 将循环视为单个表达式,因此每个点依次进行。
  • 我不需要使用 R 代码中的库(动画)吗?

标签: r animation latex knitr beamer


【解决方案1】:

如图形手册所述,仅记录来自高级绘图命令(例如plot.new())的绘图和完整的表达式。这意味着如果你在一个 for 循环中有多个低级绘图更改,这些更改将不会被一一记录,因为 for 循环中只有 one 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 表达式中的低级图形变化。

【讨论】:

  • 我希望有人能找到解决手册中内容的方法。我猜不是。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-21
  • 2014-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-21
  • 1970-01-01
相关资源
最近更新 更多