Ich möchte Punkte aus einer Normalverteilung abtasten und dann nacheinander mit dem gganimate
Paket ein Punktdiagramm erstellen, bis der letzte Frame das vollständige Punktdiagramm zeigt.
Eine Lösung, die für größere Datensätze mit 5.000 bis 20.000 Punkten geeignet ist, ist unerlässlich.
Hier ist der Code, den ich bisher habe:
library(gganimate)
library(tidyverse)
# Generate 100 normal data points, along an index for each sample
samples <- rnorm(100)
index <- seq(1:length(samples))
# Put data into a data frame
df <- tibble(value=samples, index=index)
Der df sieht so aus:
> head(df)
# A tibble: 6 x 2
value index
<dbl> <int>
1 0.0818 1
2 -0.311 2
3 -0.966 3
4 -0.615 4
5 0.388 5
6 -1.66 6
Das statische Diagramm zeigt das richtige Punktdiagramm:
# Create static version
plot <- ggplot(data=df, mapping=aes(x=value))+
geom_dotplot()
Die gganimate
Version jedoch nicht (siehe unten). Es werden nur die Punkte auf der x-Achse platziert und nicht gestapelt.
plot+
transition_reveal(along=index)
Ähnliches wäre ideal: Bildnachweis: https://gist.github.com/thomasp85/88d6e7883883315314f341d2207122a1
Antworten:
Eine andere Möglichkeit besteht darin, die Punkte mit einem anderen Geom zu zeichnen. Sie müssen zuerst einige Zählungen an Ihren Daten vornehmen (und diese zusammenfassen), aber es ist nicht erforderlich, Ihre Daten länger zu machen.
Zum Beispiel können Sie verwenden
geom_point
, aber die Herausforderung besteht darin, die Abmessungen Ihrer Punkte richtig zu machen, damit sie sich berühren / nicht berühren. Dies hängt vom Ansichtsfenster / der Dateigröße ab.Du kannst aber auch einfach
ggforce::geom_ellipse
deine Punkte zeichnen :)geom_point (Versuch und Irrtum mit Ansichtsfenstergröße)
geom_ellipse (Volle Kontrolle über die Punktgröße )
Wenn Sie den Link aktualisieren, den Sie zu Thomas 'erstaunlichem Beispiel bereitstellen, können Sie sehen, dass er einen ähnlichen Ansatz verwendet - er verwendet geom_circle anstelle von geom_ellipse, das ich aufgrund der besseren Kontrolle sowohl des vertikalen als auch des horizontalen Radius gewählt habe.
Um den "fallenden Tropfen" -Effekt zu erzielen, benötigen Sie
transition_states
eine lange Dauer und viele Bilder pro Sekunde.Erstellt am 2020-04-29 durch das reprex-Paket (v0.3.0)
Einige Inspirationen von: ggplot dotplot: Was ist die richtige Verwendung von geom_dotplot?
quelle
Versuche dies. Die Grundidee besteht darin, die Obs in Frames zu gruppieren, dh nach Index aufzuteilen und dann die Samples in Frames zu akkumulieren, dh in Frame 1 wird nur die erste Obs angezeigt, in Frame 2 Obs 1 und 2, ..... Vielleicht dort ist ein eleganterer Weg, um dies zu erreichen, aber es funktioniert:
Erstellt am 2020-04-27 durch das reprex-Paket (v0.3.0)
quelle
Ich denke, der Schlüssel hier ist, sich vorzustellen, wie Sie diese Animation manuell erstellen würden, das heißt, Sie würden dem resultierenden Punktdiagramm jeweils eine Beobachtung hinzufügen. In diesem Sinne bestand der Ansatz, den ich hier verwendete, darin, ein
ggplot
Objekt zu erstellen , das aus Plotebenen = Anzahl der Beobachtungen bestand, und dann Schicht für Schicht über Schritt für Schritt durchzugehentransition_layer
.Beachten Sie, dass ich festgelegt habe
keep_layers=FALSE
, um ein Überzeichnen zu vermeiden. Wenn Sie das ursprünglicheggplot
Objekt zeichnen , werden Sie sehen, was ich meine, da die erste Beobachtung 100 Mal, die zweite 99 Mal ... usw. aufgezeichnet wird.Was ist mit der Skalierung für größere Datensätze?
Da Anzahl der Frames = Anzahl der Beobachtungen, müssen Sie die Skalierbarkeit anpassen. Hier halten Sie einfach die # Frames konstant, was bedeutet, dass Sie den Code die Frames in Segmente gruppieren lassen müssen, was ich über die
seq()
Funktion mache und spezifizierelength.out=100
. Beachten Sie auch im neuen Beispiel, dass der Datensatz enthältn=5000
. Um das Punktdiagramm im Rahmen zu halten, müssen Sie die Größe der Punkte wirklich klein machen. Ich habe die Punkte hier wahrscheinlich etwas zu klein gemacht, aber Sie haben die Idee. Nun ist die Anzahl der Frames = Anzahl der Beobachtungsgruppen.quelle