Gganimate с ggplot: легенда не отображается

Вопрос или проблема

У меня есть этот скрипт, и анимация работает нормально, но я не могу получить легенду/гид. На статической карте легенда появляется автоматически.

Вот код для анимированного графика:

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 может мешать отображению легенды. Давайте рассмотрим ваш код и предложим несколько решений для обеспечения правильного отображения легенды в анимации.

Возможные решения:

  1. Переопределение названия легенды: Убедитесь, что name в функции scale_fill_continuous правильно задан. В вашем случае это выглядит успешно, но стоит убедиться, что данные для Capacity корректные.

  2. Использование guides(): Вы можете явно указать, что хотите, чтобы легенда была видимой, добавив guides() в ваш код. Например:

    guides(fill = guide_colorbar(title = "Capacity"))
  3. Настройка темы и позиции легенды: В некоторых случаях изменение позиции легенды может помочь ей правильно отображаться. Попробуйте изменить legend.position на right или другое значение:

    theme(legend.position = "right")
  4. Общий пример: Вот как ваш полный код может выглядеть с этими изменениями:

    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
  5. Проверка на наличие NA: Также убедитесь, что в ваших данных нет NA значений в колонке Capacity, так как это может повлиять на отображение легенды.

Используя приведенные выше рекомендации, вы должны получить желаемую legend (легенду) в вашей анимации. Если проблема не решится, попробуйте загрузить другие версии ggplot2 и gganimate, так как иногда обновления могут менять поведение функций.

Оцените материал
Добавить комментарий

Капча загружается...