You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用imshow创建动画图像子图并搭配Plotly非动画图像

解决Plotly动画imshow与静态imshow子图布局问题

核心原因

Plotly Express生成的动画图自带多帧(frames)和交互控件,直接用常规子图方法无法识别动画的结构,必须手动拆分动画的trace、帧信息,再和静态图的trace整合到统一的子图布局中。

具体实现步骤

  • 用plotly.subplots.make_subplots定义子图结构(比如1行2列)
  • 提取静态imshow图的trace,添加到指定子图位置
  • 拆分动画imshow的trace和帧,给每个元素指定对应的子图行列,再整合到新的子图对象里
  • 复制原动画的交互控件(播放按钮、滑块)到新布局中

可运行示例代码

import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import numpy as np

# 生成测试数据
static_img = np.random.rand(10, 10)  # 静态图像数据
anim_imgs = [np.random.rand(10, 10) for _ in range(5)]  # 5帧动画数据

# 创建静态图和动画图
static_fig = px.imshow(static_img)
anim_fig = px.imshow(anim_imgs, animation_frame=0)

# 初始化1行2列的子图
subplot_fig = make_subplots(
    rows=1, cols=2,
    subplot_titles=["静态图像", "动画过渡效果"]
)

# 添加静态图trace到第1列
subplot_fig.add_trace(static_fig.data[0], row=1, col=1)

# 添加动画图的所有trace到第2列
for trace in anim_fig.data:
    subplot_fig.add_trace(trace, row=1, col=2)

# 处理动画帧:给每个帧的trace指定子图位置
new_frames = []
for frame in anim_fig.frames:
    updated_frame = go.Frame(
        data=[go.Heatmap(
            z=frame.data[0].z,
            row=1, col=2,
            colorscale=frame.data[0].colorscale
        )],
        name=frame.name
    )
    new_frames.append(updated_frame)
subplot_fig.frames = new_frames

# 复制原动画的交互控件
subplot_fig.update_layout(
    updatemenus=anim_fig.layout.updatemenus,
    sliders=anim_fig.layout.sliders
)

# 调整整体布局尺寸
subplot_fig.update_layout(height=500, width=1000)
subplot_fig.show()

关键注意事项

  • 动画帧里的trace必须明确指定row和col,否则会默认显示在第一个子图区域
  • 如果需要统一静态图和动画图的颜色范围,可以用subplot_fig.update_coloraxes(cmin=0, cmax=1)来设置
  • 若原动画有自定义悬停信息、颜色刻度,复制帧的时候要同步保留这些属性

内容的提问来源于stack exchange,提问作者Jackie Dong

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 10:10:15