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

Bokeh循环生成多图时使用Span组件遇到问题求助

解决Bokeh循环生成图表时Span组件的问题

Hey Garry,刚接触Bokeh就碰到循环绘图的小坑很正常,我帮你分析下问题所在,再给你调整后的可行代码~

最可能的问题根源

你现在把upperLimit和lowerLimit这两个Span实例定义在了循环外面,然后在循环里重复把它们添加到不同的图表中。但Bokeh的可视化组件(比如Span)只能属于一个绘图对象,重复添加会导致Span要么只出现在最后一个图里,要么直接触发报错。

修正后的代码示例

把Span的创建逻辑放到循环内部,让每个图表都拥有自己独立的Span实例:

from bokeh.plotting import figure, show
from bokeh.models import Span

titleString = 'Test Plot'
plotVals = [1, 2]
xVals = [0,1,2,3,4]
yVals = [2,4,3,4,2]

# 循环生成每个图表
for t in plotVals:
    # 每个循环创建新的figure实例
    p = figure(title=f"{titleString} - {t}", x_axis_label='X轴', y_axis_label='Y轴')
    # 绘制基础折线
    p.line(xVals, yVals, line_width=2)
    
    # 关键:在循环内部创建Span,每个图用专属的实例
    upperLimit = Span(location=6, dimension='width', line_color='red', line_dash='dashed', line_width=1)
    lowerLimit = Span(location=-6, dimension='width', line_color='red', line_dash='dashed', line_width=1)
    
    # 将Span添加到当前图表的布局中
    p.add_layout(upperLimit)
    p.add_layout(lowerLimit)
    
    # 显示单个图表(如果要批量展示,可改用gridplot整合多个图)
    show(p)

额外小技巧

如果你的plotVals对应不同的上下限阈值,还可以把Span的location参数和循环变量关联起来,实现动态调整:

# 示例:每个图表的上限是t的3倍,下限是-t的3倍
upperLimit = Span(location=t*3, dimension='width', line_color='red', line_dash='dashed', line_width=1)
lowerLimit = Span(location=-t*3, dimension='width', line_color='red', line_dash='dashed', line_width=1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:05:35