Je voudrais échantillonner des points à partir d'une distribution normale, puis créer un pointplot un par un en utilisant le gganimate
package jusqu'à ce que la trame finale montre le pointplot complet.
Une solution qui fonctionne pour des ensembles de données plus importants ~ 5 000 - 20 000 points est essentielle.
Voici le code que j'ai jusqu'à présent:
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)
Le df ressemble à ceci:
> 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
Le tracé statique montre le pointplot correct:
# Create static version
plot <- ggplot(data=df, mapping=aes(x=value))+
geom_dotplot()
Cependant, la gganimate
version ne fonctionne pas (voir ci-dessous). Il place uniquement les points sur l'axe des x et ne les empile pas.
plot+
transition_reveal(along=index)
Quelque chose de similaire serait idéal: Crédit: https://gist.github.com/thomasp85/88d6e7883883315314f341d2207122a1
Réponses:
Une autre option consiste à dessiner les points avec un autre géom. vous devrez d'abord compter sur vos données (et les regrouper), mais cela ne nécessite pas de prolonger la durée de vos données.
Par exemple, vous pouvez utiliser
geom_point
, mais le défi sera d'obtenir les bonnes dimensions de vos points, afin qu'ils touchent / ne touchent pas. Cela dépend de la taille du périphérique / fichier.Mais vous pouvez aussi simplement utiliser
ggforce::geom_ellipse
pour dessiner vos points :)geom_point (essai et erreur avec les dimensions de l'appareil)
geom_ellipse (Contrôle total de la taille du point)
mise à jour dans le lien que vous fournissez à l'exemple étonnant de thomas, vous pouvez voir qu'il utilise une approche similaire - il utilise geom_circle au lieu de geom_ellipse, que j'ai choisi en raison d'un meilleur contrôle pour le rayon vertical et horizontal.
Pour obtenir l'effet "gouttes tombantes", vous aurez besoin d'
transition_states
une longue durée et de plusieurs images par seconde.Créé le 2020-04-29 par le package reprex (v0.3.0)
une inspiration de: ggplot dotplot: Quelle est la bonne utilisation de geom_dotplot?
la source
Essaye ça. L'idée de base est de regrouper les obs dans les trames, c'est-à-dire de les diviser par index, puis d'accumuler les échantillons dans les trames, c'est-à-dire que dans la trame 1, seul le premier obs est affiché, dans la trame 2 obs 1 et 2, ..... est un moyen plus élégant d'y parvenir, mais cela fonctionne:
Créé le 2020-04-27 par le package reprex (v0.3.0)
la source
Je pense que la clé ici est d'imaginer comment vous créeriez cette animation manuellement, c'est-à-dire que vous ajouteriez des points une observation à la fois au pointplot résultant. Dans cet esprit, l'approche que j'ai utilisée ici était de créer un
ggplot
objet composé de couches de tracé = nombre d'observations, puis de passer en revue couche par couche viatransition_layer
.Notez que j'ai défini
keep_layers=FALSE
pour éviter le surplotage. Si vous tracez l'ggplot
objet initial , vous verrez ce que je veux dire, puisque la première observation est tracée 100 fois, la seconde 99 fois ... etc.Qu'en est-il de la mise à l'échelle pour des ensembles de données plus volumineux?
Étant donné que le nombre d'images = nombre d'observations, vous devez ajuster pour l'évolutivité. Ici, gardez les # frames constants, ce qui signifie que vous devez laisser le code grouper les frames en segments, ce que je fais via la
seq()
fonction, en spécifiantlength.out=100
. Notez également dans le nouvel exemple, l'ensemble de données contientn=5000
. Afin de garder le pointplot dans le cadre, vous devez rendre les tailles des points vraiment minuscules. J'ai probablement fait les points un peu trop petits ici, mais vous avez l'idée. Maintenant, les # frames = nombre de groupes d'observations.la source