Призрак geom_text в gganimate - PullRequest
2 голосов
/ 29 мая 2020

Я экспериментирую с gganimate и считаю, что он ведет себя немного странно, когда дело доходит до лейблов (я в основном следовал этому примеру).

Я создаю следующий .gif с этим фрагментом кода (вы можете найти данные здесь , не хотите, чтобы длина сообщения увеличивалась).

library(gganimate)
library(dplyr)

df <- read.csv("https://pastebin.com/raw/QvhdVqwM", stringsAsFactors = FALSE) %>% 
  mutate(date = as.Date(date))

countries_anim <- df %>%
  filter(country_code == "de") %>% 
  ggplot(aes(date, value, colour = city_name)) +
  geom_line() +
  geom_segment(aes(xend = max(date) - 30, yend = value), linetype = 2,
               colour = "grey") +
  geom_text(aes(x = max(date) - 29, label = city_name), hjust = 0) +
  theme(legend.position = "bottom") +
  guides(colour = guide_legend(title.position = "top")) +
  transition_reveal(date)

n_days <- as.integer(max(df$date) - min(df$date))

anim <- animate(plot = countries_anim, duration = 10,
                      renderer = gifski_renderer(file = 'figures/de.gif'))

Все работает очень хорошо, за исключением одного незначительного неудобства: в самом начале анимации некоторые аннотации (которые должны следовать тенденции временных рядов) постоянно печатаются в области графика. Я пытался сменить средство визуализации, но проблема, похоже, совершенно не коррелирована.

enter image description here

Я не разбираюсь во внутреннем устройстве gganimate, и я ' m интересно, как я мог go отладить проблему.

1 Ответ

0 голосов
/ 05 июня 2020

Несколько часов пытался отладить это, но, похоже, я нашел решение. Очевидно, что на анимированные аннотации влияет порядок данных; как вы можете видеть в примере ниже, мой набор данных был упорядочен по убыванию (date). Изменение порядка, кажется, помогает аннотациям вести себя лучше:

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

df <- read.csv("https://pastebin.com/raw/QvhdVqwM", stringsAsFactors = FALSE) %>% 
  mutate(date = as.Date(date))

# Dates are in descending order
df %>%
  filter(country_code == "de") %>% 
  head %>% 
  as_tibble()

#> # A tibble: 6 x 10
#>   big_change change_from_pre… date       type  region_id value city_name
#>   <lgl>                 <int> <date>     <chr> <chr>     <int> <chr>    
#> 1 FALSE                    -3 2020-05-28 one_… de-berlin    28 Berlin   
#> 2 FALSE                     3 2020-05-28 one_… de-hambu…    32 Hamburg  
#> 3 FALSE                     2 2020-05-28 one_… de-rhine…    31 Rhine-Ru…
#> 4 FALSE                     2 2020-05-27 one_… de-berlin    32 Berlin   
#> 5 FALSE                    -3 2020-05-27 one_… de-hambu…    28 Hamburg  
#> 6 FALSE                     3 2020-05-27 one_… de-rhine…    28 Rhine-Ru…
#> # … with 3 more variables: country_code <chr>, note <chr>, country <chr>

countries_anim <- df %>%
  filter(country_code == "de") %>% 
  arrange(date) %>%  # arranging by date solves the problem.
  ggplot(aes(date, value, colour = city_name)) +
  geom_line() +
  geom_segment(aes(xend = max(date) - 30, yend = value), linetype = 2,
               colour = "grey") +
  geom_text(aes(x = max(date) - 29, label = city_name), hjust = 0) +
  theme(legend.position = "bottom") +
  guides(colour = guide_legend(title.position = "top")) +
  transition_reveal(date)

country_anim <- animate(plot = countries_anim, duration = 10,
                        renderer = gifski_renderer(file = 'figures/countries.gif'))

Я не совсем уверен, почему это происходит, поскольку порядок данных на самом деле не нарушает gpplot2.

enter image description here

...