【问题标题】:R: gganimate with geom_densityR:gganimate 与 geom_density
【发布时间】:2020-04-18 05:48:15
【问题描述】:

我正在尝试使用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

有什么想法可以让我的图表动起来吗?

【问题讨论】:

    标签: r ggplot2 gganimate


    【解决方案1】:

    无需将YEAR 转换为因子。相反,只需将factor(YEAR) 映射到fill。这样你就可以在过渡时间内使用YEAR,一切都很好。

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

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

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

    【讨论】:

    • 噢,非常感谢 stefan!顺便说一句,你制作的图表非常好。我更改了您的建议并输入ggplot(aes(NDVI,group=YEAR))。但是,R 在绘图部分给我的输出是静态的。也许我必须把它保存在某个地方才能看到它移动?我正在尝试ggsave("TRY2.gif", width = 40, height = 24, units= "cm")但它不起作用。再次感谢!
    • @OriolBaenaCrespo 谢谢。我刚刚编辑了我的代码并添加了您的代码的修订版本。希望有效。没有任何数据就没那么容易了。 (; 顺便说一句:ggsave 不适用于动画。它用于保存 ggplots。看看gganimate::anim_save()。gganimate 相当于 ggsave。
    • 再次感谢斯特凡!当运行p + transition_time(YEAR) + ease_aes('linear')它给出错误2: file_renderer failed to copy frames to the destination directory
    • 嗯。做了一个快速的谷歌搜索。可能是权限问题。见community.rstudio.com/t/…。或者没有安装 gifski 包的问题。见community.rstudio.com/t/…
    • 确实如此!我找到了一个有可爱 youtube 教程的家伙!去工作吧!非常感谢 stefan,注意安全!
    猜你喜欢
    • 2016-09-21
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 2018-05-09
    • 2014-11-22
    • 2022-01-21
    相关资源
    最近更新 更多