R: gganimate 与 geom_density

R: gganimate with geom_density

我正在尝试使用 gganimate 创建动画图表。我的默认图表,静态是这样的:

但是我有 12 个(第 0 年、第 1 年、第 2 年等)而不是 3 个分组变量。我不想将所有 12 个变量一起绘制,而是想对其进行动画处理。避免:

这些内核密度图制作如下:

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

有什么想法可以为我的图表制作动画吗?

不需要将 YEAR 转换为因数。而是简单地将 factor(YEAR) 映射到 fill。这样你就可以在过渡时间使用YEAR,一切都很好。

使用 gapminder::gapminder 数据集作为示例数据,以下代码绘制了全球预期寿命密度随时间变化的动画。

(顺便说一句:您可以直接在 fill 上映射 YEAR 以获得连续色标,而不是使用分类色标。但是,在这种情况下,您必须映射 YEAR 也谈 group 审美):

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')

reprex package (v0.3.0)

于 2020-04-17 创建

编辑:

据我所知,在没有看到你的数据集的情况下,你必须像这样调整你的代码(通过检查你的代码,我猜 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")