Анимированный барплот через gganimate: поле аннотации с изменяющимся текстом под графиком - PullRequest
0 голосов
/ 16 февраля 2019

Я хочу создать анимированный барплот с пакетом gganimate.Под барплотом я хочу аннотировать текстовое поле.Текст внутри поля должен со временем меняться.Ось X барплота должна двигаться (как указано view_follow).Однако текстовое поле должно отображаться в фиксированной точке графика.

Рассмотрим следующий пример:

# Create example data
df <- data.frame(ordering = c(rep(1:3, 2), 3:1, rep(1:3, 2)),
                 year = factor(sort(rep(2001:2005, 3))),
                 value = round(runif(15, 0, 100)),
                 group = rep(letters[1:3], 5))

library("gganimate")
library("ggplot2")

# Create animated ggplot with coord_flip
ggp <- ggplot(df, aes(x = ordering, y = value)) +
  geom_bar(stat = "identity", aes(fill = group)) +
  transition_states(year, transition_length = 2, state_length = 0) +
  view_follow(fixed_x = TRUE) +
  coord_flip() +
  theme(axis.title.x = element_blank(),
        axis.ticks.x = element_blank(),
        axis.text.x  = element_blank(),
        axis.title.y = element_blank(),
        axis.ticks.y = element_blank(),
        axis.text.y  = element_blank(),
        plot.margin = unit(c(1, 1, 8, 1), "cm"))

enter image description here

Вопрос: Как можно аннотировать текстовое поле с изменяющимся текстом в белой области под этим графиком?

1 Ответ

0 голосов
/ 05 марта 2019

Удовлетворяет ли это вашим потребностям?

df %>%

  # calculate the value range for each year state
  group_by(year) %>%
  mutate(max.value = max(value)) %>%
  ungroup() %>%

  # add text for each year state (I came up with some random lines for illustration)
  mutate(text = case_when(year == "2001" ~ "2001: launch of Wikipedia",
                          year == "2002" ~ "Brazil wins 2002 World Cup",
                          year == "2003" ~ "2003 saw SARS outbreak",
                          year == "2004" ~ "Olympics 2004 in Greece",
                          TRUE ~ "2005 - first YouTube upload")) %>%

  ggplot(aes(x = ordering, y = value)) +
  geom_col(aes(fill = group)) +

  # add blank layer with maximum value so that the plot's overall range
  # changes smoothly between states
  geom_blank(aes(y = max.value)) +

  # add text layer positioned in the middle, below visible range
  geom_text(aes(y = max.value / 2, label = text),
            x = 0, check_overlap = TRUE) +

  # turn off clipping to show text layer
  coord_flip(clip = "off") +

  theme(axis.title = element_blank(),
        axis.ticks = element_blank(),
        axis.text  = element_blank(),
        plot.margin = unit(c(1, 1, 8, 1), "cm")) +

  # (optional) increase state_length so that the text labels can be viewed longer
  transition_states(year, transition_length = 2, state_length = 2) +
  view_follow(fixed_x = TRUE)

(Если текстовая строка одинакова для каждого года, результирующий слой geom_text будет оставаться абсолютно неподвижным во время анимации.)

result

Данные:

set.seed(123)
df <- data.frame(ordering = c(rep(1:3, 2), 3:1, rep(1:3, 2)),
                 year = factor(sort(rep(2001:2005, 3))),
                 value = round(runif(15, 0, 100)),
                 group = rep(letters[1:3], 5))
...