Использование 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)