如何在 R 中为多个热图设置动画

Posted

技术标签:

【中文标题】如何在 R 中为多个热图设置动画【英文标题】:How to animate several heatmaps in R 【发布时间】:2021-09-29 16:10:39 【问题描述】:

我有 30 个方阵形式的热图。每个热图都链接到一个日期,我想创建一个动画,根据日期从一个热图过渡到下一个。为此,我在R 中使用gganimate,但遇到了一些问题。让我用一些随机数据展示一个例子

# GENERATE RANDOM DATA. 30 3X3 MATRICES STORED IN list_matrices
pacman::p_load(tidyverse, ggplot2, av, gganimate)

list_matrices = list()
for(i in 1:30)list_matrices[[i]] = matrix(runif(9), nrow=3)

# PUT ALL THE MATRICES TOGETHER INTO A TIBBLE AND 
# DO A PIVOT LONGER IN ORDER TO USE GGPLOT

for(i in 1:length(list_matrices))

  tmp_result = list_matrices[[i]] %>%  as_tibble() %>% 
    mutate(rowname = c('a', 'b', 'c'),
           frame = i) %>%
    pivot_longer(-c(rowname, frame), names_to = 'colname')
  if(i == 1)
  
    df_result = tmp_result
   else
    df_result = rbind(df_result, tmp_result)
  

这是我将绘制的数据框:

> df_result
# A tibble: 270 x 4
rowname frame colname  value
<chr>   <int> <chr>    <dbl>
1 a         1  V1      0.456 
2 a         1  V2      0.716 
3 a         1  V3      0.316 
4 b         1  V1      0.724 
5 b         1  V2      0.766

我创建了情节:

p <- ggplot(data = df_result, aes(x = rowname, y = colname, fill = value)) + 
  geom_tile() + 
  geom_text(aes(label = round(value, 3))) +
  scale_fill_gradient(low="white", high="red", limits=c(0, 1))

p + transition_time(frame) +
  labs(title = "Date: frame_time")

我在这里遇到三个问题

    我将其输出到视频中,但无论 list_matrices 中的矩阵数量(即,无论我拥有多少热图),视频总是持续 10 秒,因此过渡太快了。有没有办法增加视频时长?

    视频质量很差。有没有办法提高质量?

    我将变量的值包含在热图中,并且我已将geom_text(aes(label = round(value, 3))) 设置为四舍五入,但视频中的某些热图显示的小数位数超过 3。知道为什么会发生这种情况以及如何解决吗?

【问题讨论】:

【参考方案1】:

你的三个问题可以这样解决

    fps 更改为 1 以减慢速度(进一步修改以减慢速度)。

    另存为png 以获得更好的视频质量

    在标签中使用as.character() 结束您的回合。

    p &lt;- ggplot(data = df_result, aes(x = rowname, y = colname, fill = value)) + geom_tile() + geom_text(aes(label = as.character(round(value,3)))) + scale_fill_gradient(low="white", high="red", limits=c(0, 1))

    pp &lt;- p + transition_time(frame) + labs(title = "Date: frame_time")

    animate(pp, fps=1, dev="png")

【讨论】:

以上是关于如何在 R 中为多个热图设置动画的主要内容,如果未能解决你的问题,请参考以下文章

如何在mapview中为标记(叠加)图像设置动画

使用 ggplot2 在 r 中为热图准备数据框

Matplotlib 热图动画非常小[重复]

如何在 Swift 中为 NSLayoutConstraint 设置动画?

如何在 Angular 中为 *ngFor 设置动画?

如何在 Angular 中为 *ngFor 设置动画?