Chciałbym próbkować punkty z rozkładu normalnego, a następnie budować wykres punktowy jeden po drugim, używając gganimate
pakietu, aż ostatnia ramka pokaże pełny wykres punktowy.
Niezbędne jest rozwiązanie, które działa dla większych zbiorów danych ~ 5 000 - 20 000 punktów.
Oto kod, który mam do tej pory:
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)
Df wygląda następująco:
> 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
Wykres statyczny pokazuje prawidłowy wykres punktowy:
# Create static version
plot <- ggplot(data=df, mapping=aes(x=value))+
geom_dotplot()
Jednak gganimate
wersja nie ma (patrz poniżej). Umieszcza tylko kropki na osi X i nie układa ich w stos.
plot+
transition_reveal(along=index)
Coś podobnego do tego byłoby idealne: Credit: https://gist.github.com/thomasp85/88d6e7883883315314f341d2207122a1
Odpowiedzi:
Inną opcją jest narysowanie punktów inną geom. najpierw trzeba będzie liczyć na swoje dane (i binowanie), ale nie wymaga to przedłużenia danych.
Na przykład możesz użyć
geom_point
, ale wyzwaniem będzie prawidłowe wyregulowanie wymiarów punktów, aby dotykały / nie dotykały. Zależy to od rozmiaru okna / pliku.Ale możesz także użyć
ggforce::geom_ellipse
do narysowania kropek :)geom_point (próba i błąd z rozmiarem rzutni)
geom_ellipse (Pełna kontrola wielkości punktu)
aktualizacja w linku, który podajesz do niesamowitego przykładu Thomasa, widać, że stosuje on podobne podejście - używa geom_circle zamiast geom_ellipse, które wybrałem ze względu na lepszą kontrolę zarówno w pionie, jak i w poziomie.
Aby uzyskać efekt „spadających kropel”, potrzebujesz
transition_states
długiego czasu działania i wielu klatek na sekundę.Utworzono 2020-04-29 przez pakiet reprezentx (v0.3.0)
inspiracja z: ggplot dotplot: Jakie jest właściwe zastosowanie geom_dotplot?
źródło
Spróbuj tego. Podstawową ideą jest zgrupowanie obs do ramek, tj. Podzielenie według indeksu, a następnie nagromadzenie próbek do ramek, tj. W ramce 1 pokazany jest tylko pierwszy obs, w ramce 2 obs 1 i 2, ... Być może tam jest bardziej eleganckim sposobem na osiągnięcie tego, ale działa:
Utworzono 2020-04-27 przez pakiet reprezentx (v0.3.0)
źródło
Myślę, że kluczem tutaj jest wyobrażenie sobie, jak utworzyłbyś tę animację ręcznie, co oznacza, że dodawałeś kropki po jednej obserwacji na wynikowy wykres punktowy. Mając to na uwadze, zastosowałem tutaj podejście polegające na stworzeniu
ggplot
obiektu, który składałby się z warstw wykresu = liczba obserwacji, a następnie krok po kroku przez warstwętransition_layer
.Zauważ, że ustawiłem,
keep_layers=FALSE
aby uniknąć overplottingu. Jeśli wykreślisz początkowyggplot
obiekt, zobaczysz, co mam na myśli, ponieważ pierwsza obserwacja jest wykreślana 100 razy, druga 99 razy ... itd.Co ze skalowaniem dla większych zestawów danych?
Ponieważ liczba klatek = liczba obserwacji, należy dostosować skalowalność. Tutaj po prostu utrzymuj # ramki na stałym poziomie, co oznacza, że musisz pozwolić kodowi grupować ramki w segmenty, co robię za pomocą
seq()
funkcji, określająclength.out=100
. Uwaga: w nowym przykładzie zestaw danych zawieran=5000
. Aby utrzymać kropkę w ramce, musisz zrobić naprawdę małe rozmiary kropek. Prawdopodobnie zrobiłem tutaj kropki trochę za małe, ale masz pomysł. Teraz # klatek = liczba grup obserwacji.źródło