загальний сюжет, де точки залишаються, а лінія згасає


11

Ось відтворюваний приклад статичного сюжету, який я хочу оживити (я хочу показати, як поводиться зразок MCMC).

library(tidyverse)
library(gganimate)

set.seed(1234)
plot_data <- tibble(x=cumsum(rnorm(100)),
                    y=cumsum(rnorm(100)),
                    time=1:length(x)) 

ggplot(data=plot_data,
       aes(x=y, y=x)) +
  geom_point() + geom_line()

введіть тут опис зображення

Що я хотів би бачити, це точки, які видно, коли вони намальовані і трохи зів’яли (тобто альфа переходить від, наприклад, 1 до 0,3) після цього, тоді як буде лінія, яка показує лише недавню історію (і в ідеалі блякне, показуючи найновіша історія найменш згасла і більше ніж кілька кроків назад повністю зникає).

Далі досягається більш-менш того, що я хочу для моїх очок (тому в певному сенсі я просто хочу додати до цього зникаючі лінії, що з'єднують останні кілька пунктів - точки, які повільніше зникають через деякі кадри, будуть ще приємнішими):

ggplot(data=plot_data,
       aes(x=y, y=x)) +
  geom_point() +
  transition_time(time) +
  shadow_mark(past = T, future=F, alpha=0.3)

Сюжет, що показує, як точки повинні блякнути

З чим я боюся - це додати два різних способи поведінки для двох геометрій, наприклад, точки та лінії. Наприклад, внизу точки зникають (я не хочу, щоб вони були), а рядки не зникають (я хочу, щоб вони).

p <- ggplot(data=plot_data,
       aes(x=y, y=x)) +
  geom_point() +
  transition_time(time) +
  shadow_mark(past = T, future=F, alpha=0.3)

p + geom_line() +
  transition_reveal(along = time) +
  shadow_mark(past = T, future=F, alpha=0.3) 

Відповіді:


17

У мене виникли проблеми з використанням вбудованих shadow_*функцій для контролю над однією поведінкою одночасно; здавалося, що якраз застосував найновіший. (Використання gganimate 1.0.3.9000)

Один із способів обійти це - обчислити переходи вручну. Наприклад, ми могли скопіювати дані 100 разів, по одній копії для кожного кадру, а потім окремо вказати альфа для нашого шару точок та альфа для шару нашого сегмента.

plot_data %>%
  uncount(100, .id = "frame") %>%
  filter(time <= frame) %>%
  arrange(frame, time) %>%
  group_by(frame) %>%
  mutate(x_lag = lag(x), 
         y_lag = lag(y),
         tail = last(time) - time,
         # Make the points solid for 1 frame then alpha 0.3
         point_alpha = if_else(tail == 0, 1, 0.3),
         # Make the lines fade out over 20 frames
         segment_alpha = pmax(0, (20-tail)/20)) %>%
  ungroup() %>%

  ggplot(aes(x=y, y=x, xend = y_lag, yend = x_lag, group = time)) +
  geom_segment(aes(alpha = segment_alpha)) +
  geom_point(aes(alpha = point_alpha)) +
  scale_alpha(range = c(0,1)) +
  guides(alpha = F) +
  transition_manual(frame)

введіть тут опис зображення

(Для цього візуалізації я його загорнув animate( [everything above], width = 600, height = 400, type = "cairo"))


1
Дуже дякую. Одне незначне питання у вашій відповіді: point_alpha = ... & segment_alpha = ... має бути всередині мутації (...). Відповідно змінили відповідь.
Björn
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.