Использование gganimate с вафельными диаграммами

Я играл с waffle пакет, и я пытаюсь заставить его работать с gganimate.

С помощью mpg в качестве примера я создал вафельные диаграммы, чтобы показать количество моделей по каждому class. Затем я хотел бы использовать gganimate для отображения, в свою очередь, диаграммы моделей по классам для каждого производителя. я могу использоватьfacet_wrap() чтобы показать диаграммы для всех производителей одновременно, но хотелось бы иметь возможность просматривать их.

Когда я пытаюсь применить gganimate к вафельному графику, я получаю сообщение об ошибке:

Ошибка в отображении (FUN = f, ..., SIMPLIFY = FALSE): входы нулевой длины нельзя смешивать с входами ненулевой длины

Я не уверен, если waffle несовместимо с gganimate, или если я что-то делаю не так.

Вот код:

library(tidyverse)
library(waffle)
library(gganimate)

data("mpg")
d <- mpg

d$class <- as.factor(d$class)
d$manufacturer <- as.factor(d$manufacturer)

plot <- d %>% count(manufacturer, class) %>%
  ggplot(aes(fill = class, values = n)) +
  geom_waffle(color = "white",
              size = .75,
              n_rows = 4) +
  ggthemes::scale_fill_tableau(name = NULL) +
  coord_equal() +
  theme_minimal() +
  theme(panel.grid = element_blank(), axis.text = element_blank(), legend.position = "bottom")

#Facet wrap works fine:
plot + facet_wrap(~ manufacturer)

#gganimate returns error:
plot + transition_states(manufacturer, transition_length = 2, state_length = 2)


Был бы очень признателен за любую помощь! Спасибо.

1 ответ

Я не уверен насчет совместимости ggwaffle с gganimate, но другой вариант - использовать animationпакет для создания GIF. Например:

library(animation)

saveGIF({
  for (i in unique(d$manufacturer)) {

    d1 = d %>% filter(manufacturer==i)

    gg1 <- d1 %>%
      count(manufacturer, class) %>%
      ggplot(aes(fill = class, values = n)) +
        geom_waffle(color = "white",
                    size = .75,
                    n_rows = 4) +
        scale_y_continuous(expand=c(0,0)) +
        ggthemes::scale_fill_tableau(name = NULL) +
        coord_equal() +
        theme_minimal(base_size=40) +
        theme(panel.grid = element_blank(), 
              axis.text = element_blank(), 
              legend.position = "bottom",
              plot.title=element_text(hjust=0.5)) +
        labs(title=i)
    print(gg1)
  }
}, movie.name="test.gif", ani.height=500, ani.width=500*3)

Другие вопросы по тегам