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))
次のようなものを生成します:
アニメーションの特定のポイントで一時停止を定義する方法があるかどうか知りたいと思いました。たとえば10日目、20日目、アニメーションが終了した後、再びループします。 geom_reveal
ありません state_length
またはtransition_length
引数を使用できるので、これが可能かどうかはわかりません。
編集:パッケージ作成者は Twitter でそれが可能であると述べていますが、彼が参照している「タイミングを明らかにする」引数はわかりませんに。
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)
しかしそれを行ったとき、私はそれが一時停止ではないことに気づきました-それはトゥイーンを遅くするだけでした。一種の「弾丸の時間」効果-かっこいいですが、私が探していたものではありません。
したがって、私の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()