R: gganimate с geom_density - PullRequest
       30

R: gganimate с geom_density

0 голосов
/ 17 апреля 2020

Я пытаюсь создать анимированный график с gganimate. Мой дефолтный график, stati c выглядит примерно так: enter image description here

Но вместо 3 группирующих переменных у меня 12 (год 0, год 1, год 2 и т. Д. c) .). Вместо того, чтобы построить все 12 переменных вместе, я хотел бы оживить это. Чтобы избежать: enter image description here

Эти графики плотности ядра сделаны следующим образом:

data_decidious %>% tidyr::gather("YEAR", "NDVI", colsPostNDVI) %>%    
  mutate(YEAR = str_remove(YEAR, 'meanNDVIyear')) %>% mutate(YEAR = str_remove(YEAR, 'meanprefire_NDVI')) %>% mutate(YEAR = as.factor(YEAR)) %>%    
  ggplot(aes(NDVI,fill=YEAR)) + geom_density(alpha=.2) + xlim(0.3, 0.7) + ylim(0,46) +
  xlab("Mean NDVI") + ylab("Kernal density") + guides(fill=guide_legend(title="Comparative"))

Я обнаружил, что этот geom_density() работает только при добавлении mutate(YEAR = as.factor(YEAR)). Это означает, что когда я добавляю:

transition_time(YEAR) + ease_aes('linear')

Я получаю ошибку:

Error: time data must either be integer, numeric, POSIXct, Date, difftime, orhms
In addition: Warning message:
In min(cl[cl != 0]) : no non-missing arguments to min; returning Inf

Есть идеи оживить мой график?

1 Ответ

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

Преобразование YEAR в коэффициент не требуется. Вместо этого просто сопоставьте factor(YEAR) с fill. Таким образом, вы можете использовать YEAR во время перехода, и все в порядке.

Используя набор данных gapminder::gapminder в качестве примера, приведите следующий код и анимируйте плотность всемирной ожидаемой продолжительности жизни во времени.

(Кстати: вместо использования категориальной цветовой шкалы вы можете отобразить YEAR непосредственно на fill, чтобы получить непрерывную цветовую шкалу. Однако в этом случае вам необходимо отобразить YEAR также на group эстетику c):

library(ggplot2)
library(dplyr)
library(gganimate)

p <- gapminder::gapminder %>% 
  ggplot(aes(lifeExp, fill = factor(year))) + 
  geom_density(alpha=.2) + 
  xlab("Life Expectancy") + 
  ylab("Kernal density") +
  guides(fill = guide_legend(title = "Year"))

p + 
  transition_time(year) + 
  ease_aes('linear')

Создано в 2020-04-17 пакетом Представить (v0.3.0)

Редактировать:

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

data_long <- data_decidious %>% 
  tidyr::gather("YEAR", "NDVI", colsPostNDVI) %>%    
  mutate(YEAR = str_remove(YEAR, 'meanNDVIyear')) %>% 
  mutate(YEAR = str_remove(YEAR, 'meanprefire_NDVI')) %>% 
  # Convert YEAR to integer
  mutate(YEAR = as.integer(YEAR)) 

p <- data_long %>%    
  ggplot(aes(NDVI,fill=factor(YEAR))) + 
  geom_density(alpha=.2) + 
  xlim(0.3, 0.7) + 
  ylim(0,46) +
  xlab("Mean NDVI") + 
  ylab("Kernal density") + 
  guides(fill=guide_legend(title="Comparative"))

p + 
  transition_time(YEAR) + 
  ease_aes('linear')

anim_save("test.gif")
...