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
相关产品推荐
相关产品推荐

