You need to enable JavaScript to run this app. Jupyter Notebook中pandas-bokeh新增元素如何避免图表重复显示
优惠活动
大模型
产品
解决方案
定价
更多

Jupyter Notebook中pandas-bokeh新增元素如何避免图表重复显示

问题根因

pandas-bokeh的plot_bokeh方法默认开启了自动展示参数show_figure=True,执行绘图语句时就会直接在Notebook中渲染第一张图表,后续手动调用show()就会生成第二份重复图表。

方案1:延迟绘制(最推荐)

完全匹配你提到的「等待所有元素添加完成后再统一展示」的需求,代码改动最小,无副作用:

import pandas as pd
import numpy as np
import pandas_bokeh
from bokeh.models import Span
from bokeh.plotting import show
pandas_bokeh.output_notebook()

np.random.seed(42)
df = pd.DataFrame({"Google": np.random.randn(1000)+0.2, 
                   "Apple": np.random.randn(1000)+0.17}, 
                   index=pd.date_range('1/1/2000', periods=1000))
df = df.cumsum()
df = df + 50

# 核心改动:添加show_figure=False参数,禁止自动渲染图表
fig = df.plot_bokeh(kind="line", show_figure=False)
# 先添加所有附加元素
span = Span(location=150, dimension='width', line_color='green')
fig.add_layout(span)
# 全部配置完成后统一展示
show(fig)

方案2:原地更新已有图表

如果已经渲染了图表不想重新执行绘图逻辑,可以用bokeh内置的更新能力直接修改已展示的图表,不会生成新的重复图表:

import pandas as pd
import numpy as np
import pandas_bokeh
from bokeh.models import Span
from bokeh.io import push_notebook

pandas_bokeh.output_notebook()

np.random.seed(42)
df = pd.DataFrame({"Google": np.random.randn(1000)+0.2, 
                   "Apple": np.random.randn(1000)+0.17}, 
                   index=pd.date_range('1/1/2000', periods=1000))
df = df.cumsum()
df = df + 50

# 绘图时开启notebook_handle,绑定已渲染的图表
fig = df.plot_bokeh(kind="line", notebook_handle=True)
# 添加Span元素
span = Span(location=150, dimension='width', line_color='green')
fig.add_layout(span)
# 原地更新已展示的图表,不会生成新图表
push_notebook(handle=fig)

该方案适合需要动态修改图表的交互场景,比如用控件实时调整参数时使用

方案3:提前清空已有输出

如果前面的图表已经渲染,也可以在展示新图表前清空当前cell的输出,再渲染更新后的图表:

import pandas as pd
import numpy as np
import pandas_bokeh
from bokeh.models import Span
from bokeh.plotting import show
from IPython.display import clear_output

pandas_bokeh.output_notebook()

np.random.seed(42)
df = pd.DataFrame({"Google": np.random.randn(1000)+0.2, 
                   "Apple": np.random.randn(1000)+0.17}, 
                   index=pd.date_range('1/1/2000', periods=1000))
df = df.cumsum()
df = df + 50

fig = df.plot_bokeh(kind="line")
span = Span(location=150, dimension='width', line_color='green')
fig.add_layout(span)
# 清空当前cell的所有已有输出,wait=True表示等新输出准备好再清
clear_output(wait=True)
# 展示更新后的图表
show(fig)

该方案会清空当前cell内的所有历史输出,包括打印的文字内容,非必要不推荐使用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 16:27:04