ポイントが留まり、線がフェードするgananimateプロット


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)

ポイントがどのようにフェードするかを示すプロット

私が苦労しているのは、ポイントとラインなど、2つのジオメトリに2つの異なる動作を追加する方法です。たとえば、以下では点が消え(私はそれらが欲しくない)、線は消えません(私はそれらが欲しがります)。

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を使用)

これを回避する1つの方法は、遷移を手動で計算することです。たとえば、データを100回コピーし、フレームごとに1つコピーしてから、ポイントレイヤーのアルファとセグメントレイヤーのアルファを個別に指定します。

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
どうもありがとうございました。回答の1つのマイナーな問題:point_alpha = ...&segment_alpha = ...は、mutate(...)内にある必要があります。それに応じて回答を変更しました。
ビョルン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.