Я хотел бы выбрать точки из нормального распределения, а затем построить точечный график один за другим, используя gganimate
пакет, пока последний кадр не покажет полный точечный график.
Решение, которое работает для больших наборов данных ~ 5000 - 20000 точек, имеет важное значение.
Вот код, который у меня есть:
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 выглядит так:
> 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
Статический график показывает правильный точечный график:
# Create static version
plot <- ggplot(data=df, mapping=aes(x=value))+
geom_dotplot()
Тем не менее, gganimate
версия не (см. Ниже). Он только ставит точки на оси X и не складывает их.
plot+
transition_reveal(along=index)
Нечто подобное было бы идеально: Кредит: https://gist.github.com/thomasp85/88d6e7883883315314f341d2207122a1
r
ggplot2
data-visualization
gganimate
Максимум
источник
источник
Ответы:
Другой вариант - нарисовать точки другим геом. сначала вам нужно будет сделать некоторые подсчеты для ваших данных (и для биннинга), но это не требует увеличения объема ваших данных.
Например, вы можете использовать
geom_point
, но задача будет в том, чтобы правильно определить размеры ваших точек, чтобы они касались / не касались. Это зависит от размера устройства / файла.Но вы также можете просто использовать,
ggforce::geom_ellipse
чтобы нарисовать свои точки :)geom_point ( метод проб и ошибок с размерами устройства)
geom_ellipse (полный контроль размера точки)
Обновив ссылку, которую вы предоставляете, на удивительный пример Томаса, вы можете увидеть, что он использует аналогичный подход - он использует geom_circle вместо geom_ellipse, который я выбрал из-за лучшего контроля как вертикального, так и горизонтального радиуса.
Чтобы получить эффект «падающих капель», вам понадобится
transition_states
и большая длительность, и множество кадров в секунду.Создано 2020-04-29 пакетом представлением (v0.3.0)
вдохновение от: ggplot dotplot: Как правильно использовать geom_dotplot?
источник
Попробуй это. Основная идея состоит в том, чтобы сгруппировать объекты obs в кадры, т.е. разделить по индексу, а затем накапливать выборки в кадры, т.е. в кадре 1 отображаются только первые объекты obs, в кадрах 2 obs 1 и 2, ..... Возможно, есть это более элегантный способ добиться этого, но он работает:
Создано 2020-04-27 по пакету представительства (v0.3.0)
источник
Я думаю, что ключевой момент здесь состоит в том, чтобы представить, как вы бы создали эту анимацию вручную, то есть вы бы добавляли точки по одному наблюдению за раз в результирующий точечный график. Имея это в виду, подход, который я использовал здесь, состоял в том, чтобы создать
ggplot
объект, который состоял из слоев графика = количество наблюдений, а затем пошагово проходил слой за слоемtransition_layer
.Обратите внимание, что я установил,
keep_layers=FALSE
чтобы избежать переполнения. Если вы начертите начальныйggplot
объект, вы поймете, что я имею в виду, поскольку первое наблюдение строится 100 раз, второе - 99 раз ... и т. Д.Как насчет масштабирования для больших наборов данных?
Так как количество кадров = количество наблюдений, вам необходимо настроить масштабируемость. Здесь просто оставьте # frames постоянным, то есть вы должны позволить коду сгруппировать кадры в сегменты, что я делаю с помощью
seq()
функции, определяющейlength.out=100
. Обратите внимание также, что в новом примере набор данных содержитn=5000
. Чтобы держать точечную диаграмму в рамке, вам нужно сделать размеры точек очень маленькими. Я, вероятно, сделал точки слишком маленькими, но вы поняли идею. Теперь # frames = количество групп наблюдений.источник