我使用 FastAPI 作为 Python 后端,并使用 Plotly 根据一些数据生成图表。在客户端,我使用 HTMX。
服务器直接发送 Plot 的 HTML Figure.to_html( full_html = False)
,然后 HTMX 将其直接交换到页面中的正确位置。
这一切都非常方便且易于操作,但现在我需要在数据发生变化时实时更新绘图。因此,我使用 FastAPI 和ws
HTMX 扩展建立了 websocket 连接,以便在需要时更新绘图。
问题是,如果我在每次更新数据时再次发送整个图,整个图就会被 HTMX 交换,用户就会丢失图的当前视图状态,即缩放率、平移位置等...
那么有没有办法可以更详细地了解从 Plotly 发送的内容?
我需要:
- 仅设置一次情节(我想用 Plotly.js?)
- 单独发送数据(从 Plotly python 库导出它们?)
- 以不破坏用户视图状态的方式使用新数据更新图表。
我该如何做?可能吗?
除了 HTMX(原理应该保持不变),我建议:
Python 后端提供初始页面:它包含一个具有特定 id 的空 div 包装器、初始数据和使用 Plotly.js 创建/更新绘图的脚本:
后端向客户端发送实时数据(JSON)。
客户端将新数据附加到当前数据并相应地更新图表(参见Plotly.js 函数参考)
您还可以在 Python 中初始化整个图形以利用 Plotly.py 及其模板(未包含在 Plotly.js 中),这样您就不必在 JavaScript 中手动执行此操作。用于
fig.to_json()
序列化整个图形,例如。并注入
fig_json
你的脚本(而不仅仅是那些data
需要更新的道具):为了正确地序列化
data
props(除了图之外),特别是当它们包含由第三方模块(如 numpy、pandas、PIL)提供的类型时,使用pio.json.to_json_plotly()
: