dgrtwo gganimate 및 ggforce를 통해 움직이는 패싯 줌이있는 애니메이션 플롯?



gganimate time series (1)

저는 수년에 걸쳐 Europe 의 GDP를 확대하고 싶습니다. phantastic ggforce::facet_zoom 은 매우 정적 인 플롯 (즉, 특정 연도)을 허용합니다.

그러나 움직이는 비늘은 예상보다 어렵습니다. gganimate 는 첫 번째 프레임 (xy year == 1952 )에서 x 축 한계를 취하고 애니메이션이 끝날 때까지 지속되는 것처럼 보입니다. 이와 관련되었지만 코드와 관련된 구식 질문은 불행히도 대답을 얻지 못했습니다 . + coord_cartesian(xlim = c(from, to)) 이나 facet_zoom(xlim = c(from, to)) 정적 제한을 초과하는 facet_zoom 창에 영향을 줄 수 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의 현재 개발 버전에서는 아직 가능하지 않다고 생각합니다. 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) 

또는 gifski 를 사용하여 작은 파일 <2MB :

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) 

(시간이 더 많으면 수동으로 지정한 나누기를 사용하여 전설에서 혼란스러운 변경 사항을 제거하려고 노력할 것입니다.)