Bokeh共享轴范围报错:IndexError: list index out of range排查
问题根源与解决方案
这个错误的原因很直观——你在创建列表的同一行里尝试引用p[0],但此时列表p还没有被完全初始化呢!
为什么会报错?
当你写p = [figure(...), figure(x_range=p[0].x_range, ...)]时,Python会先计算方括号内的所有元素,再把最终结果赋值给变量p。也就是说,在创建第二个figure的瞬间,p还没有被赋值,它只是一个正在构建的、不完整的列表,根本不存在p[0]这个元素,自然就抛出了IndexError。
正确的实现方式
你需要拆分创建步骤,确保第一个图表对象完全创建后,再用它的x_range来初始化第二个图表:
方式1:分步创建再组合
# 先创建第一个图表 fig1 = figure(title="Title", x_axis_label='Time (secs)', y_axis_label='Voltage (V)', tools=TOOLS, x_range=(0, 500), y_range=(0, 1000)) # 基于第一个图表的x_range创建第二个图表 fig2 = figure(title="Title_1", x_axis_label='Time (secs)', y_axis_label='Voltage (V)', tools=TOOLS, x_range=fig1.x_range, y_range=(0, 500)) # 最后把两个图表放进列表 p = [fig1, fig2]
方式2:先初始化空列表再逐个添加
p = [] # 添加第一个图表到列表 p.append(figure(title="Title", x_axis_label='Time (secs)', y_axis_label='Voltage (V)', tools=TOOLS, x_range=(0, 500), y_range=(0, 1000))) # 此时p[0]已经存在,可直接引用它的x_range p.append(figure(title="Title_1", x_axis_label='Time (secs)', y_axis_label='Voltage (V)', tools=TOOLS, x_range=p[0].x_range, y_range=(0, 500)))
这样设置后,两个图表的X轴范围就会完全同步,平移其中任意一个图表时,另一个也会跟着一起移动,实现你想要的联动效果。
内容的提问来源于stack exchange,提问作者falo8056
相关产品推荐
相关产品推荐

