web-dev-qa-db-ja.com

gganimateのtransition_revealを使用して特定のフレーム/時間ポイントで一時停止する方法はありますか?

Githubのパッケージのwikiにある this の例を利用する:

airq <- airquality
airq$Month <- format(ISOdate(2004,1:12,1),"%B")[airq$Month]

ggplot(airq, aes(Day, Temp, group = Month)) + 
  geom_line() + 
  geom_segment(aes(xend = 31, yend = Temp), linetype = 2, colour = 'grey') + 
  geom_point(size = 2) + 
  geom_text(aes(x = 31.1, label = Month), hjust = 0) + 
  transition_reveal(Month, Day) + 
  coord_cartesian(clip = 'off') + 
  labs(title = 'Temperature in New York', y = 'Temperature (°F)') + 
  theme_minimal() + 
  theme(plot.margin = margin(5.5, 40, 5.5, 5.5))

次のようなものを生成します:

enter image description here

アニメーションの特定のポイントで一時停止を定義する方法があるかどうか知りたいと思いました。たとえば10日目、20日目、アニメーションが終了した後、再びループします。 geom_reveal ありません state_lengthまたはtransition_length引数を使用できるので、これが可能かどうかはわかりません。

編集:パッケージ作成者は Twitter でそれが可能であると述べていますが、彼が参照している「タイミングを明らかにする」引数はわかりませんに。

12
Nautica

OPから:

編集:パッケージの作者は、[これを行う]ことが可能であると述べていますが、彼が言及している「タイミングを明らかにする」引数が何であるかはわかりません。

Twitterで、トーマス・リン・ペダーセンはtransition_reveal行がアニメーションのフレームをどのように動かしているかに言及していました。そのため、プロットの元の変数を残しながら、アニメーションの「ハートビート」となる1つの変数をフィードできます。

私の最初のアプローチは、ハートビートになる新しい変数reveal_timeを作成することでした。アニメーションがこれらのデータポイントにより多くの時間を費やすように、一時停止ポイントでさらにインクリメントします。ここでは、一時停止ポイントの日に10を追加し、他の日に1を追加することでそれを行いました。

library(dplyr)
airq_slowdown <- airq %>%
  group_by(Month) %>%
  mutate(show_time = case_when(Day %in% c(10,20,31) ~ 10,
                                     TRUE           ~ 1),
         reveal_time = cumsum(show_time)) %>%
  ungroup()

次に、それをアニメーションに入力して、ソースデータフレームとtransition_reveal行を変更しました。

library(gganimate)
a <- ggplot(airq_slowdown, aes(Day, Temp, group = Month)) + 
  geom_line() + 
  geom_segment(aes(xend = 31, yend = Temp), linetype = 2, colour = 'grey') + 
  geom_point(size = 2) + 
  geom_text(aes(x = 31.1, label = Month), hjust = 0) + 
  transition_reveal(reveal_time) +  # Edit, previously had (Month, reveal_time)
  coord_cartesian(clip = 'off') + 
  labs(title = 'Temperature in New York', y = 'Temperature (°F)') + 
  theme_minimal() + 
  theme(plot.margin = margin(5.5, 40, 5.5, 5.5))    
animate(a, nframe = 50)

enter image description here

しかしそれを行ったとき、私はそれが一時停止ではないことに気づきました-それはトゥイーンを遅くするだけでした。一種の「弾丸の時間」効果-かっこいいですが、私が探していたものではありません。

したがって、私の2番目のアプローチは、アニメーションの一時停止した行を実際にコピーすることでした。そうすることで、トゥイーンがなくなり、実際の一時停止が発生します。

airq_pause <- airq %>%
  mutate(show_time = case_when(Day %in% c(10,20,31) ~ 10,
                               TRUE           ~ 1)) %>%
  # uncount is a tidyr function which copies each line 'n' times
  uncount(show_time) %>%
  group_by(Month) %>%
  mutate(reveal_time = row_number()) %>%
  ungroup()

enter image description here

15
Jon Spring