Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

transition_states computes a wrong nframes #481

Open
lgaborini opened this issue Apr 18, 2023 · 3 comments
Open

transition_states computes a wrong nframes #481

lgaborini opened this issue Apr 18, 2023 · 3 comments

Comments

@lgaborini
Copy link

Similar issue to #384.
I'm plotting a super simple plot that cycles over discrete states, forcing no transitions.

There are 3 discrete states, so I would expect 3 frames.
I also force 3 frames in the output.

Instead, the output has 4 frames (an extra transitioning frame is added) and one of the states is missing.

Tested with 1.0.8 (CRAN) and the latest 1.0.8.9000.

library(dplyr)
library(ggplot2)
library(gganimate)

p <- mtcars |> 
   ggplot(aes(wt, mpg)) +
   geom_point(
      aes(
         col = gear
      ),
      size = 2
   ) +
   transition_states(
      gear,
      transition_length = 0,
      state_length = 1
   ) +
   labs(
      title = "Frame {frame}/{nframes}"
   )

n_states <- length(unique(mtcars$gear))
n_states
#> [1] 3

a <- animate(
   plot = p,
   nframes = n_states,
   fps = 1,
   detail = 1,
   start_pause = 0,
   end_pause = 0,
   rewind = FALSE
)

a

frame_vars()
#>   frame nframes progress transitioning previous_state closest_state next_state
#> 1     1       4     0.25         FALSE              3             3          3
#> 2     2       4     0.50         FALSE              3             3          3
#> 4     4       4     1.00          TRUE              4             4          5
#>                                                                              frame_source
#> 1 C:\\Users\\LORENZ~1\\AppData\\Local\\Temp\\RtmpiiFiZG\\1ca411191ef0/gganim_plot0001.png
#> 2 C:\\Users\\LORENZ~1\\AppData\\Local\\Temp\\RtmpiiFiZG\\1ca411191ef0/gganim_plot0002.png
#> 4 C:\\Users\\LORENZ~1\\AppData\\Local\\Temp\\RtmpiiFiZG\\1ca411191ef0/gganim_plot0003.png

Created on 2023-04-18 with reprex v2.0.2

Thanks!

@lgaborini
Copy link
Author

lgaborini commented Apr 19, 2023

Bug found, transition_states adds an extra frame if the animation wraps.
Solution: disable wrapping

  transition_states(
      gear,
      transition_length = 0,
      state_length = 1,
      wrap = FALSE
   )

Perhaps disable adding extra frames if transitions are not explicitly desired?

@lgaborini
Copy link
Author

Ok still not correct, not all states are cycled and transitions are still happening (sorry for the spam):

library(ggplot2)
library(gganimate)

p <- mtcars |> 
   ggplot(aes(wt, mpg)) +
   geom_point(
      aes(
         color = gear
      ),
      size = 2
   ) +
   transition_states(
      gear,
      transition_length = 0,
      state_length = 1,
      wrap = FALSE
   ) +
   labs(
      title = "Frame {frame}/{nframes}: Closest gear: {closest_state}"
   )

n_states <- length(unique(mtcars$gear))
n_states
#> [1] 3

a <- animate(
   plot = p,
   nframes = n_states,
   fps = 1,
   detail = 1,
   start_pause = 0,
   end_pause = 0,
   rewind = FALSE
)

a

frame_vars()
#>   frame nframes  progress transitioning previous_state closest_state next_state
#> 1     1       3 0.3333333         FALSE              3             3          3
#> 2     2       3 0.6666667          TRUE              3             3          4
#> 3     3       3 1.0000000          TRUE              4             4          5
#>                                                                              frame_source
#> 1 C:\\Users\\LORENZ~1\\AppData\\Local\\Temp\\RtmpikQ5gg\\4d742ed529ab/gganim_plot0001.png
#> 2 C:\\Users\\LORENZ~1\\AppData\\Local\\Temp\\RtmpikQ5gg\\4d742ed529ab/gganim_plot0002.png
#> 3 C:\\Users\\LORENZ~1\\AppData\\Local\\Temp\\RtmpikQ5gg\\4d742ed529ab/gganim_plot0003.png

Created on 2023-04-19 with reprex v2.0.2

@thomasp85
Copy link
Owner

I'll look into this but I also think it is somewhat of a case of using the wrong transition, since transition_states() is explicitly for adding interpolation between states. I believe using transition_manual() you should be able to get your desired output directly?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants