Gostaria de provar pontos de uma distribuição normal e, em seguida, criar um gráfico de pontos, um por um, usando o gganimate
pacote até que o quadro final mostre o gráfico de pontos completo.
Uma solução que funcione para conjuntos de dados maiores ~ 5.000 - 20.000 pontos é essencial.
Aqui está o código que tenho até agora:
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)
O df fica assim:
> 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
O gráfico estático mostra o gráfico de pontos correto:
# Create static version
plot <- ggplot(data=df, mapping=aes(x=value))+
geom_dotplot()
No entanto, a gganimate
versão não possui (veja abaixo). Ele apenas coloca os pontos no eixo x e não os empilha.
plot+
transition_reveal(along=index)
Algo semelhante a este seria ideal: Crédito: https://gist.github.com/thomasp85/88d6e7883883315314f341d2207122a1
Respostas:
Outra opção é desenhar os pontos com outro geom. você precisará fazer algumas contagens dos dados primeiro (e binning), mas isso não exige que os dados sejam mais longos.
Por exemplo, você pode usar
geom_point
, mas o desafio será acertar as dimensões dos seus pontos, para que eles toquem / não toquem. Isso depende do tamanho do dispositivo / arquivo.Mas você também pode usar apenas
ggforce::geom_ellipse
para desenhar seus pontos :)geom_point (tentativa e erro com dimensões do dispositivo)
geom_ellipse (controle total do tamanho do ponto)
atualizar no link que você fornece ao exemplo incrível de thomas, você pode ver que ele usa uma abordagem semelhante - ele usa geom_circle em vez de geom_ellipse, que eu escolhi por causa de um melhor controle do raio vertical e horizontal.
Para obter o efeito "gotas caindo", você precisará de
transition_states
uma duração longa e de muitos quadros por segundo.Criado em 2020-04-29 pelo pacote reprex reprex (v0.3.0)
alguma inspiração de: ggplot dotplot: Qual é o uso adequado do geom_dotplot?
fonte
Tente isso. A idéia básica é agrupar os quadros obs, ou seja, dividir por índice e acumular as amostras em quadros, ou seja, no quadro 1, apenas o primeiro obs é mostrado, no quadro 2 obs 1 e 2, ..... Talvez haja é uma maneira mais elegante de conseguir isso, mas funciona:
Criado em 2020-04-27 pelo pacote reprex (v0.3.0)
fonte
Acho que a chave aqui é imaginar como você criaria essa animação manualmente, ou seja, você adicionaria pontos uma observação de cada vez no gráfico de pontos resultante. Com isso em mente, a abordagem que usei aqui foi criar um
ggplot
objeto que consistisse em camadas de plotagem = número de observações e depois passar por camada por camadatransition_layer
.Observe que eu defino
keep_layers=FALSE
para evitar a plotagem. Se você plotar oggplot
objeto inicial , verá o que quero dizer, já que a primeira observação é plotada 100 vezes, a segunda 99 vezes ... etc.E quanto ao dimensionamento para conjuntos de dados maiores?
Como número de quadros = número de observações, é necessário ajustar a escalabilidade. Aqui, apenas mantenha os # frames constantes, o que significa que você deve deixar o código agrupar os quadros em segmentos, o que estou fazendo através da
seq()
função, especificandolength.out=100
. Observe também no novo exemplo, o conjunto de dados contémn=5000
. Para manter o gráfico de pontos no quadro, você precisa diminuir o tamanho dos pontos. Provavelmente eu fiz os pontos um pouco pequenos demais aqui, mas você entende a ideia. Agora, os # quadros = número de grupos de observações.fonte