r - 使用knitr在beamer中叠加动画

标签 r animation latex knitr beamer

我想使用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/

相关文章:

javascript - 使用变换矩阵的 SVG 动画

r - 循环返回比预期更多的值和 NA

r - 使用 dplyr 条件替换 tibble 中的列名

r - 从数字 YYYYMMDD 到日期并返回到数字 YYYYMMDD 的最快方法

javascript - 动画结束监听器无法正常工作

r - 在 RMarkdown PDF 中,将章节编号从 "X Section"更改为 "Section X"

r - 在 R 中一次循环 10 列

ios - 如何创建不断增长的 iOS 按钮?

latex - 数学模式中的分组和逻辑蕴涵

latex - 如何在 .tex 或 latex 文档中插入实际或当前文件名(我在文件夹中保存的文件名)?