年間を通じて、Europe
のGDPを拡大したいと思います。ファンタスティックな_ggforce::facet_zoom
_を使用すると、静的なプロット(特定の1年間)を非常に簡単に作成できます。
ただし、スケールの移動は予想よりも難しくなります。 gganimate
は、最初のフレーム(_year == 1952
_)からx軸の制限を取得し、アニメーションの最後まで継続するようです。 残念ながら、これに関連しますが、コードのように古い質問では回答が得られませんでした 。 + coord_cartesian(xlim = c(from, to))
もfacet_zoom(xlim = c(from, to))
も、静的な制限を超えて_facet_zoom
_ウィンドウに影響を与えることができないようです。
gganimate
がすべてのフレームの_facet_zoom
_スケールを「再計算」する方法はありますか?_library(gapminder)
library(ggplot2)
library(gganimate)
library(ggforce)
p <- ggplot(gapminder, aes(gdpPercap, lifeExp, size = pop, color = continent)) +
geom_point() + scale_x_log10() +
facet_zoom(x = continent == "Europe") +
labs(title = "{frame_time}") +
transition_time(year)
animate(p, nframes = 30)
_
2018年12月現在のgganimateの現在の開発バージョンではまだ可能ではないと思います。 gganimate
でfacet_zoom
がナイスをプレイできないバグがあるようです。幸いなことに、回避策があまりにも苦痛であるとは思わない。
最初に、中間年を埋めるためにトゥイーンできます。
# Here I tween by fractional years for more smooth movement
years_all <- seq(min(gapminder$year),
max(gapminder$year),
by = 0.5)
gapminder_tweened <- gapminder %>%
tweenr::tween_components(time = year,
id = country,
ease = "linear",
nframes = length(years_all))
次に、入力として1年かかる関数にコードを採用します。
render_frame <- function(yr) {
p <- gapminder_tweened %>%
filter(year == yr) %>%
ggplot(aes(gdpPercap, lifeExp, size = pop, color = continent)) +
geom_point() +
scale_x_log10(labels = scales::dollar_format(largest_with_cents = 0)) +
scale_size_area(breaks = 1E7*10^0:3, labels = scales::comma) +
facet_zoom(x = continent == "Europe") +
labs(title = round(yr + 0.01) %>% as.integer)
# + 0.01 above is a hack to override R's default "0.5 rounds to the
# closest even" behavior, which in this case gives more frames
# (5 vs. 3) to the even years than the odd years
print(p)
}
最後に、年(この場合は小数年を含む)をループしてアニメーションを保存できます。
library(animation)
oopt = ani.options(interval = 1/10)
saveGIF({for (i in 1:length(years_all)) {
render_frame(years_all[i])
print(paste0(i, " out of ",length(years_all)))
ani.pause()}
},movie.name="facet_zoom.gif",ani.width = 400, ani.height = 300)
または、2 MB未満の小さいファイルにはgifski
を使用します。
gifski::save_gif({ for (i in 1:length(years_all) {
render_frame(years_all[i])
print(paste0(i, " out of ",length(years_all)))
}
},gif_file ="facet_zoom.gif", width = 400, height = 300, delay = 1/10, progress = TRUE)
(時間があれば、手動で指定した区切りを使用して、凡例の煩わしい変更を削除しようとします。)