首页 > 解决方案 > 使用 plotly 跨动画帧的恒定热图

问题描述

我想创建一个动画人物,其中热图作为“背景”。也就是说,我希望热图在各个帧中保持不变。

到目前为止,这是我的代码:

library(plotly)
library(dplyr)

df1 <- data.frame(f = rep(1:5, c(rep(50, 5))), 
                  x = round(runif(250, 10,100),0),
                  y = round(runif(250, 10,100),0)) 


df2 <- expand.grid(x=seq(0,100,10), y=seq(0,100,10))
df2$col[df2$x>50] = "green"
df2$col[df2$x<=50] = "red"
df2$col[df2$x<=20] = "blue"



plot_ly() %>%
  plotly::add_markers(data = df1, y = ~y,x = ~x,frame=~f)%>%
  plotly::add_heatmap(data = df2,
                      x = ~x,
                      y = ~y,
                      z = as.numeric(factor(df2$col, ordered = T, levels = unique(df2$col))),
                      xgap = 0.5,
                      ygap = 0.5) 
  

生产:

在此处输入图像描述

我可以创建地图,在第 1 帧上一切看起来都很好。但是,当我向前移动一帧时,热图消失了。有人对此有解决方案吗?

顺便说一句, ggplotly 不是一个选项,因为 plotly 和 heatmap 的组合太慢了。

标签: rplotlyheatmap

解决方案


您是否尝试过df2按帧数重复对象?尽管重建热图会导致帧之间出现明显的延迟,但以下是一个潜在的解决方案:

# repeat df2 five times
df2 = do.call("rbind", replicate(5, df2, simplify = FALSE))
df2$f = rep(1:5, each = nrow(df2)/5)

plot_ly() %>%
  plotly::add_markers(data = df1, y = ~y,x = ~x,frame=~f)%>%
  plotly::add_heatmap(data = df2,
                      x = ~x,
                      y = ~y,
                      frame=~f,
                      z = as.numeric(factor(df2$col, ordered = T, levels = unique(df2$col))),
                      xgap = 0.5,
                      ygap = 0.5) 

推荐阅读