jar*_*emi 5 animation latex r beamer knitr
我想使用knitr包和chunk选项在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}
Run Code Online (Sandbox Code Playgroud)
从看knitr显卡手册,它指出地块的两个来源是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}
Run Code Online (Sandbox Code Playgroud)
但这似乎有些过分,因为每个人都会重新绘制情节以及前面所有的观点.
有没有办法摆脱循环j?或者其他一些在beamer/knitr中叠加图的方法?如果是,我的代码如何修改以实现这一目标?
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])
}
Run Code Online (Sandbox Code Playgroud)
是的,这看起来是一种严重的资源浪费,“自然”的方式应该是像你一样逐一添加点,而不是打开一个新的情节并从1到绘制点i,但是没有办法检测低级别单个 R 表达式内的图形变化。
| 归档时间: |
|
| 查看次数: |
1176 次 |
| 最近记录: |