Как избавиться от мерцания осей, вызванного Координатой при использовании gganimate, view_follow и geom_tile? - PullRequest
4 голосов
/ 11 апреля 2020

Скажем, у нас гонка гистограмм со шкалой x-axis. Взяв код точно из этого ответа @ Jon Spring и добавив самую последнюю строку (перед строкой анимации):

library(tidyverse)
library(gganimate)
library(gapminder)
theme_set(theme_classic())

gap <- gapminder %>%
    filter(continent == "Asia") %>%
    group_by(year) %>%
    # The * 1 makes it possible to have non-integer ranks while sliding
    mutate(rank = min_rank(-gdpPercap) * 1) %>%
    ungroup()

p <- ggplot(gap, aes(rank, group = country, 
                     fill = as.factor(country), color = as.factor(country))) +
    geom_tile(aes(y = gdpPercap/2,
                  height = gdpPercap,
                  width = 0.9), alpha = 0.8, color = NA) +

    # text in x-axis (requires clip = "off" in coord_*)
    # paste(country, " ")  is a hack to make pretty spacing, since hjust > 1 
    #   leads to weird artifacts in text spacing.
    geom_text(aes(y = 0, label = paste(country, " ")), vjust = 0.2, hjust = 1) +

    coord_flip(clip = "off", expand = FALSE) +
    scale_y_continuous(labels = scales::comma) +
    scale_x_reverse() +
    guides(color = FALSE, fill = FALSE) +

    labs(title='{closest_state}', x = "", y = "GFP per capita") +
    theme(plot.title = element_text(hjust = 0, size = 22),
          axis.ticks.y = element_blank(),  # These relate to the axes post-flip
          axis.text.y  = element_blank(),  # These relate to the axes post-flip
          plot.margin = margin(1,1,1,4, "cm")) +

    transition_states(year, transition_length = 4, state_length = 1) +
    ease_aes('cubic-in-out') +
    view_follow()

animate(p, fps = 25, duration = 20, width = 800, height = 600)

Проблема в том, что мигает по оси.

Как это исправить? Обратите внимание, что, похоже, это происходит от coord_flip кода .

См. Также здесь для решения, когда используется код geom_bar.

Однако в моем случае код использует geom_tile. Что я могу сделать?

1 Ответ

1 голос
/ 14 апреля 2020

Я думаю, что нашел ответ, после того, как опубликовал этот вопрос на github . Как вы указали в своем вопросе, это, по-видимому, известная проблема, связанная с мерцанием оси при использовании coord_flip() с анимацией.

Я пробовал geom_rect вместо geom_tile, но это все равно заставляет вас мерцать. .

Что работает, так это geom_colh вместо geom_tile! Это из пакета ggstance. Вот код:

ggplot(gap, aes(y=rank, group = country, 
    fill = as.factor(country), color = as.factor(country))) +

geom_colh(aes(x=gdpPercap/2), width=0.9, alpha = 0.8, color = NA) +

geom_text(aes(x = 0, label = paste(country, " ")), vjust = 0.2, hjust = 1) +

scale_y_reverse(labels = scales::comma) +
guides(color = FALSE, fill = FALSE) +
coord_cartesian(clip='off') +

labs(title='{closest_state}', x = "GFP per capita", y = "") +
theme(
    plot.title = element_text(hjust = 0, size = 22),
    axis.ticks.y = element_blank(),
    axis.text.y  = element_blank(),
    plot.margin = margin(1,1,1,4, "cm"),
    axis.line.y = element_blank()) +

transition_states(year, transition_length = 4, state_length = 1) +
ease_aes('cubic-in-out') +
view_follow()

Таким образом, чтобы go было изменено:

  • geom_colh используется вместо geom_tile. Вам нужен пакет ggstance для этого - я даже не пробовал geom_col, но я думаю, вы будете мигать с этим.

  • scale_y_reverse этот вызов содержит ваш вызов меток вместо scale_y_continuous, так как вы тоже хотите повернуть ось. Вероятно, было бы лучше, если бы вы указали y aestheti c в качестве страны, а затем переупорядочили ее на ранг .... но да, это работает так, как есть.

  • coord_cartesian(clip='off') This служит той же цели, что и настройки вашего coord_flip. Если вы хотите переполнить названия стран, вам это нужно для того, чтобы текст выводился на go «вне» области графика. Опять же - было бы лучше, если бы вы использовали y=country, но снова ... эх, это работает.

  • axis.line.y = element_blank() удалено для удобства просмотра - или вы можете оставить его и играть с поля вашего графика располагаются между осью и началом столбцов. Опять же - да, это работает.

enter image description here

Могут быть и другие способы, но это, кажется, разумный обходной путь. Хорошая графика c!

...