You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

点击按钮后如何清除旧绘图历史并重新绘制新数据图?

解决Bokeh重复绘图:清除旧图重新绘制

嘿,这个问题我之前帮人排查过好多次!点击按钮触发绘图时新旧图叠加,本质是每次绘图都在同一个figure对象上新增了渲染元素,旧的没有被移除。下面给你具体的解决思路和代码修改方案:

核心思路

Bokeh的figure对象有一个renderers属性,它是一个列表,存储了当前图里所有的绘图元素(比如线条、散点、柱状图等)。只要在绘制新数据前清空这个列表,就能彻底移除旧的绘图内容,再重新绘制新数据就不会叠加了。

具体实现步骤

  1. 在计算新数据之后、绘图之前,添加清除代码
    直接给p.renderers赋值为空列表即可:
    p.renderers = []
    
  2. 重新执行你的绘图逻辑
    清空旧元素后,再调用p.line()p.circle()等方法绘制新数据就可以了。

结合你的代码片段修改示例

假设你的原有代码是这样的(补全了部分缺失内容):

# 初始化figure(这部分应该是在按钮触发逻辑之外,只执行一次)
p = figure(plot_height=600, plot_width=700,x_axis_type="datetime", title="Plot Data", toolbar_location=None, tools='')
p.legend.location = "top_left"
p.legend.orientation = "horizontal"

# 按钮触发的回调函数
def update_plot():
    # 1. 获取新输入值、计算新数据(你的原有逻辑)
    input_value = get_new_input()
    calculated_data = compute_data(input_value)
    
    # 2. 清除旧绘图元素
    p.renderers = []
    
    # 3. 重新绘制新数据(这里用line举例子,你可以换成自己的绘图类型)
    p.line(x=calculated_data['datetime'], y=calculated_data['values'], legend_label="Updated Data", line_width=2)
    # 如果还有其他绘图元素,比如散点,继续在这里添加

额外注意点

  • 如果你的figure是初始化后一直复用的(不是每次都新建),这个方法最有效;如果每次点击按钮都新建figure,那问题可能出在你没有替换掉页面上的旧图组件,这时候需要用Bokeh的curdoc()或者组件替换逻辑,但从你的描述看,应该是复用同一个figure的情况。
  • 清空renderers后,图例会自动更新,因为图例条目是和对应的渲染器绑定的,旧渲染器被移除,图例里的旧条目也会跟着消失。

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

火山引擎 最新活动