Вопрос или проблема
У меня есть этот скрипт, и анимация работает нормально, но я не могу получить легенду/гид. На статической карте легенда появляется автоматически.
Вот код для анимированного графика:
alapadatok <- attendance
alapadatok <- alapadatok %>%
mutate(across(where(is.character), ~ na_if(., "n.a.")))
alapadatok <- alapadatok %>%
mutate(across(starts_with("c") | contains("/"), as.numeric))
capacity_long <- alapadatok %>%
select(League, starts_with("c")) %>%
pivot_longer(cols = starts_with("c"),
names_to = "Season",
values_to = "Capacity")
capacity_long$Capacity <- as.numeric(as.character(capacity_long$Capacity))
map_data <- map_data("world")
# Фильтруем данные карты, чтобы включить только соответствующие страны
map_data_filtered <- map_data %>%
filter(region %in% alapadatok$League)
# Объединяем данные карты с capacity_long
map_merged <- map_data_filtered %>%
left_join(capacity_long, by = c("region" = "League"))
animated_map <- ggplot(data = map_merged, aes(x = long, y = lat, group = group, fill = Capacity)) +
geom_polygon(color = "black", show.legend = TRUE) + # Границы стран
scale_fill_continuous(low = "lightblue", high = "blue", na.value = "grey", name = "Вместимость") +
theme(axis.text = element_blank(),
axis.title = element_blank(),
panel.grid = element_blank(),
legend.position = "middle") +
labs(title="Карта вместимости по сезонам: {closest_state}") +
transition_states(Season, transition_length = 2, state_length = 1, wrap = FALSE)
# Анимируем график
anim <- animate(animated_map, nframes = 400, fps = 20, width = 800, height = 600)
# Сохраняем анимацию
anim_save("capacity_map_animation.gif", animation = anim)
# Для предварительного просмотра в RStudio
anim
А вот код для статического графика:
ggplot(data = map_merged, aes(x = long, y = lat, group = group, fill = Capacity)) +
geom_polygon(color = "black") + # Границы стран
scale_fill_gradient(low = "lightblue", high = "blue", name = "Вместимость") +
theme_minimal() +
theme(legend.position = "right") + # Попробуйте 'right', 'bottom' или конкретные координаты
labs(title="Карта вместимости")
Я пробовал с scale_fill_gradient()
и scale_fill_continuous
, это работало с обоими, но я не смог получить легенду ни с одним из них. Также пытался добавить guides(fill = guide_colorbar())
, но тогда он запускается, но ничего не отображается в просмотрщике.
В чем может быть проблема?
Ответ или решение
Ваша проблема заключается в том, что при создании анимации с использованием пакета gganimate
, легенда может не отображаться должным образом. Это часто связано с тем, что анимация с использованием transition_states
может мешать отображению легенды. Давайте рассмотрим ваш код и предложим несколько решений для обеспечения правильного отображения легенды в анимации.
Возможные решения:
-
Переопределение названия легенды: Убедитесь, что
name
в функцииscale_fill_continuous
правильно задан. В вашем случае это выглядит успешно, но стоит убедиться, что данные дляCapacity
корректные. -
Использование
guides()
: Вы можете явно указать, что хотите, чтобы легенда была видимой, добавивguides()
в ваш код. Например:guides(fill = guide_colorbar(title = "Capacity"))
-
Настройка темы и позиции легенды: В некоторых случаях изменение позиции легенды может помочь ей правильно отображаться. Попробуйте изменить
legend.position
наright
или другое значение:theme(legend.position = "right")
-
Общий пример: Вот как ваш полный код может выглядеть с этими изменениями:
library(dplyr) library(tidyr) library(ggplot2) library(gganimate) alapadatok <- attendance %>% mutate(across(where(is.character), ~ na_if(., "n.a."))) %>% mutate(across(starts_with("c") | contains("/"), as.numeric)) capacity_long <- alapadatok %>% select(League, starts_with("c")) %>% pivot_longer(cols = starts_with("c"), names_to = "Season", values_to = "Capacity") map_data <- map_data("world") map_data_filtered <- map_data %>% filter(region %in% alapadatok$League) map_merged <- map_data_filtered %>% left_join(capacity_long, by = c("region" = "League")) animated_map <- ggplot(data = map_merged, aes(x = long, y = lat, group = group, fill = Capacity)) + geom_polygon(color = "black", show.legend = TRUE) + # Границы стран scale_fill_continuous(low = "lightblue", high = "blue", na.value = "grey", name = "Capacity") + theme(axis.text = element_blank(), axis.title = element_blank(), panel.grid = element_blank(), legend.position = "right") + # Позиция легенды labs(title="Map of Capacity in Season: {closest_state}") + guides(fill = guide_colorbar(title = "Capacity")) + # Явное указание на легенду transition_states(Season, transition_length = 2, state_length = 1, wrap = FALSE) # Анимация графика anim <- animate(animated_map, nframes = 400, fps = 20, width = 800, height = 600) # Сохранение анимации anim_save("capacity_map_animation.gif", animation = anim) # Для предварительного просмотра в RStudio anim
-
Проверка на наличие NA: Также убедитесь, что в ваших данных нет NA значений в колонке
Capacity
, так как это может повлиять на отображение легенды.
Используя приведенные выше рекомендации, вы должны получить желаемую legend (легенду) в вашей анимации. Если проблема не решится, попробуйте загрузить другие версии ggplot2
и gganimate
, так как иногда обновления могут менять поведение функций.