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

Jupyter Notebook中用新数据更新Plotly图表而非生成新图表

解决方案:在Jupyter Notebook中实现下拉更新Plotly图表

你的问题核心是每次选择新ticker时都会生成新图表,而非更新现有图表——这是因为每次调用fig.show()都会在Notebook中插入一个全新的Plotly实例,而非替换旧实例。下面提供两种高效的解决方法:


方法1:使用ipywidgets的Output容器(简单直观)

通过创建一个固定的输出容器,每次更新时清空原有内容再显示新图表,实现图表替换效果:

import plotly.graph_objects as go
import ipywidgets as widgets
import pandas as pd

df = pd.DataFrame(
    {'ticker' : ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c'], 
     'timestamp' : [1,1,1,2,2,2,3,3,3], 
     'val' : [10,11,12,21,22,23, 100, 200, 300]})

# 创建下拉组件
ddwn = widgets.Dropdown(options=df.ticker.unique(), value=df.ticker.unique()[0])
# 创建固定输出容器
output = widgets.Output()
display(ddwn, output)

def on_change(change):
    if change['type'] == 'change' and change['name'] == 'value':
        d = df[df['ticker'] == change['new']].sort_values('timestamp')
        with output:
            # 清空原有输出(wait=True避免闪烁)
            output.clear_output(wait=True)
            # 生成并显示新图表
            fig = go.Figure(data=go.Scatter(x=d.timestamp, y=d.val, name=change['new']))
            fig.show()

ddwn.observe(on_change)

方法2:使用FigureWidget直接更新数据(更高效)

利用Plotly的FigureWidget实现交互式数据更新,无需重复创建图表实例,性能更优:

import plotly.graph_objects as go
import ipywidgets as widgets
import pandas as pd

df = pd.DataFrame(
    {'ticker' : ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c'], 
     'timestamp' : [1,1,1,2,2,2,3,3,3], 
     'val' : [10,11,12,21,22,23, 100, 200, 300]})

# 初始化默认图表(用第一个ticker的数据)
default_ticker = df.ticker.unique()[0]
default_data = df[df['ticker'] == default_ticker].sort_values('timestamp')
fig_widget = go.FigureWidget(data=go.Scatter(x=default_data.timestamp, y=default_data.val, name=default_ticker))

# 创建下拉组件
ddwn = widgets.Dropdown(options=df.ticker.unique(), value=default_ticker)
display(ddwn, fig_widget)

def on_change(change):
    if change['type'] == 'change' and change['name'] == 'value':
        d = df[df['ticker'] == change['new']].sort_values('timestamp')
        # 批量更新图表数据(避免多次渲染闪烁)
        with fig_widget.batch_update():
            fig_widget.data[0].x = d.timestamp
            fig_widget.data[0].y = d.val
            fig_widget.data[0].name = change['new']
            fig_widget.layout.title.text = f'Ticker: {change["new"]}'

ddwn.observe(on_change)

关键说明

  • 你之前尝试的Matplotlib清除方案无效,是因为Plotly和Matplotlib的渲染机制完全独立,前者是基于Web的交互式图表,后者是静态位图渲染。
  • 两种方法都不需要为每个ticker创建图表字典,完全动态处理数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 19:50:18