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

Plotly中如何逐片更新热力图而不重复生成完整图表

问题根因

你的代码每轮循环都会重新执行px.imshow(df)创建全新的figure实例,再调用fig.show(),必然每次都会生成新的独立绘图,完全没有对已存在的图表做增量更新。
fig.update_traces()调用不生效,核心是两个原因:一是你没有指定要更新热力图的z属性(即热力图绑定的矩阵数据源),二是默认的fig.show()只会渲染一次性的静态输出,就算trace数据改了,已经渲染完成的静态图也不会自动刷新。

另外补充个兼容性问题:pandas 2.0及以上版本已经移除了DataFrame.append()方法,继续用会抛出属性错误,增量拼接数据请用pd.concat()。

可直接复用的实现方案

Jupyter 环境动态逐行更新

只在循环外初始化一次画布,循环内只更新已有trace的数据源,配合IPython的输出刷新能力实现无新窗口的增量更新:

import plotly.express as px
import pandas as pd
import numpy as np
import time
from IPython.display import display, clear_output

# 初始化基础数据和画布,仅执行1次
df = pd.DataFrame(np.random.rand(1, 100))
fig = px.imshow(df)
display(fig)

for i in range(10):
    # 逐行追加数据
    df = pd.concat([df, pd.DataFrame(np.random.rand(1, 100))], ignore_index=True)
    time.sleep(1)
    # 更新已有热力图的数据源,不新建画布
    fig.update_traces(z=df.values)
    # 刷新输出区域
    clear_output(wait=True)
    display(fig)

浏览器端无刷新动态更新(Dash方案)

如果需要在网页端实现流畅的动态热力图构建,不需要每次刷新页面,可以用Dash加定时回调实现:

from dash import Dash, dcc, html, Input, Output
import plotly.express as px
import pandas as pd
import numpy as np

app = Dash(__name__)
app.layout = html.Div([
    dcc.Graph(id="live-heatmap"),
    # 配置1秒触发一次更新,最多触发10次
    dcc.Interval(id="timer", interval=1000, n_intervals=0, max_intervals=10)
])

# 全局存储初始数据集
df = pd.DataFrame(np.random.rand(1, 100))

@app.callback(Output("live-heatmap", "figure"), Input("timer", "n_intervals"))
def refresh_graph(n):
    global df
    if n > 0:
        df = pd.concat([df, pd.DataFrame(np.random.rand(1, 100))], ignore_index=True)
    return px.imshow(df)

if __name__ == "__main__":
    app.run_server(debug=True)
之前写法的核心错误汇总
  • 把新建画布的px.imshow(df)逻辑写在了循环内部,每轮都生成全新的fig对象,完全没有复用初始创建的画布
  • 调用fig.update_traces()时没有传入z=df.values参数,没有命中热力图的核心数据源属性,相当于调用了空方法没改任何实际内容
  • 缺少输出刷新逻辑,fig.show()默认渲染的是一次性静态图,就算后台修改了trace数据,前端已经渲染完成的内容也不会自动同步

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 05:12:24