2014-03-30 4 views
6

Ich möchte eine Animation im Beamer mit dem Knitrack-Paket und der Chunk-Option fig.show='animate' erstellen, wobei die Zahlen überlagert und nicht ersetzt werden, ähnlich wie how \ multiinclude standardmäßig funktioniert.überlagerte Animationen in Beamer mit Knitr

Ein minimales nicht funktionierendes Beispiel wäre die folgende (Rnw-Datei), in der ich möchte, dass jeder Punkt einzeln zum vorhandenen Plot in der Animation hinzugefügt wird.

\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} 

Von am knitr graphics manual suchen, heißt es, die beiden Quellen der Parzellen sind plot.new() und grid.newpage(), hat aber eine Fußnote ?recordPlot zu sehen. Also habe ich versuchte recordPlot() nach dem points Befehl setzen (und auch einen transparenten Hintergrunds über par(bg=NA) Zugabe, aber das hat nicht funktioniert, da nur eine einzige Handlung entsteht.

Ein minimales Arbeitsbeispiel ist die folgenden

\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} 

aber das scheint übertrieben zu sein, da jede Figur die Zeichnung und alle vorhergehenden Punkte neu zeichnet

Gibt es eine Möglichkeit, die Schleife über j loszuwerden oder eine andere Möglichkeit, Diagramme in Beamer/Knitr zu überlagern? Wenn ja, wie Kann mein Code oben mo sein Schwierig, das zu ermöglichen?

+0

versuchen 'fig.keep = 'alle'' – kohske

+0

das ist ein guter Vorschlag, dass ich nicht versucht hatte. einschließlich 'fig.keep = 'all'' erlaubt mir, das minimale Arbeitsbeispiel zu vereinfachen (das ich aktualisiert habe), aber im nicht funktionierenden Beispiel, liefert es nur zwei Diagramme: eins ohne Punkte und eins mit allen Punkten eher als eine Folge von Plots, die jeden Punkt der Reihe nach hinzufügen, da R die Schleife als einen einzelnen Ausdruck behandelt. – jaradniemi

+0

Muss ich keine Bibliothek (Animation) aus dem R-Code verwenden? – skan

Antwort

5

Wie im Graphikhandbuch beschrieben, werden nur Plots von Befehlen zum Zeichnen auf hohem Niveau (z. B. plot.new()) und vollständige Ausdrücke aufgezeichnet. Das heißt, wenn Sie mehrere Low-Level-Plot-Änderungen in einer For-Schleife haben, werden diese Änderungen nicht einzeln aufgezeichnet, da die For-Schleife nur einen R-Ausdruck ist. Das zeigt Bild 4 im Handbuch.

Wenn Sie eine Animation aus einer For-Schleife erstellen möchten, müssen High-Level-Plotbefehle in der Schleife vorhanden sein. Abbildung 7 im Handbuch ist ein solches Beispiel.

In Ihrem Fall müssen Sie den plot() Anruf in die Schleife bewegen:

x = 1:2 
for (i in 1:length(x)) { 
    plot(x, x, type = "n") 
    points(x[1:i], x[1:i]) 
} 

Ja, das sieht aus wie eine ernsthafte Verschwendung von Ressourcen, und die „natürliche“ Art und Weise erhaltenen Punkte werden soll, eines nach der anderen Wie Sie es getan haben, anstatt ein neues Diagramm zu öffnen und Punkte von 1 bis i zu zeichnen, aber es gibt keine Möglichkeit, grafische Änderungen auf niedriger Ebene innerhalb eines einzelnen R-Ausdrucks zu erkennen.

+0

Ich hatte gehofft, dass jemand eine Lösung gefunden hat, die in dem Handbuch vorgestellt wurde. Ich denke nicht. – jaradniemi