Me gustaría muestrear puntos de una distribución normal, y luego construir un diagrama de puntos uno por uno usando el gganimate
paquete hasta que el cuadro final muestre el diagrama de puntos completo.
Una solución que funcione para conjuntos de datos más grandes ~ 5,000 - 20,000 puntos es esencial.
Aquí está el código que tengo hasta ahora:
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)
El df se ve así:
> 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
El diagrama estático muestra el diagrama de puntos correcto:
# Create static version
plot <- ggplot(data=df, mapping=aes(x=value))+
geom_dotplot()
Sin embargo, la gganimate
versión no lo hace (ver más abajo). Solo coloca los puntos en el eje xy no los apila.
plot+
transition_reveal(along=index)
Algo similar a esto sería ideal: Crédito: https://gist.github.com/thomasp85/88d6e7883883315314f341d2207122a1
Respuestas:
Otra opción es dibujar los puntos con otra geom. primero tendrá que hacer algunos recuentos de sus datos (y binning), pero no requiere que sus datos sean más largos.
Por ejemplo, puede usar
geom_point
, pero el desafío será obtener las dimensiones correctas de sus puntos, para que se toquen / no se toquen. Esto depende del dispositivo / tamaño del archivo.Pero también puedes usarlo
ggforce::geom_ellipse
para dibujar tus puntos :)geom_point (prueba y error con las dimensiones del dispositivo)
geom_ellipse (Control total del tamaño del punto)
actualización en el enlace que proporcione a Thomas ejemplo increíble, se puede ver que utiliza un enfoque similar - se utiliza en lugar de geom_circle geom_ellipse, que he elegido debido a un mejor control tanto para el radio vertical y horizontal.
Para obtener el efecto "gotas que caen", necesitará
transition_states
una larga duración y muchos cuadros por segundo.Creado en 2020-04-29 por el paquete reprex (v0.3.0)
alguna inspiración de: ggplot dotplot: ¿Cuál es el uso adecuado de geom_dotplot?
fuente
Prueba esto. La idea básica es agrupar los obs en cuadros, es decir, dividirlos por índice y luego acumular las muestras en cuadros, es decir, en el cuadro 1 solo se muestra el primer obs, en los cuadros 2 obs 1 y 2, ..... Quizás haya es una forma más elegante de lograr esto, pero funciona:
Creado el 27-04-2020 por el paquete reprex (v0.3.0)
fuente
Creo que la clave aquí es imaginar cómo crearía esta animación manualmente, es decir, agregaría puntos una observación a la vez al diagrama de puntos resultante. Con esto en mente, el enfoque que utilicé aquí fue crear un
ggplot
objeto que consistiera en capas de trama = número de observaciones, luego paso a paso capa por capatransition_layer
.Tenga en cuenta que configuré
keep_layers=FALSE
para evitar la sobreplotación. Si traza elggplot
objeto inicial , verá lo que quiero decir, ya que la primera observación se traza 100 veces, la segunda 99 veces ... etc.¿Qué pasa con el escalado para conjuntos de datos más grandes?
Como número de cuadros = número de observaciones, debe ajustar la escalabilidad. Aquí, simplemente mantenga los # cuadros constantes, lo que significa que debe dejar que el código agrupe los cuadros en segmentos, lo que estoy haciendo a través de la
seq()
función, especificandolength.out=100
. Tenga en cuenta también en el nuevo ejemplo, el conjunto de datos contienen=5000
. Para mantener el diagrama de puntos en el marco, debe hacer que los tamaños de los puntos sean realmente pequeños. Probablemente hice los puntos un poco demasiado pequeños aquí, pero se te ocurre la idea. Ahora los # cuadros = número de grupos de observaciones.fuente