如何使用 ColumnDataSource 更新 Span (Bokeh)?

问题描述

我正在尝试使用 ColumnDataSource 更新 Span,但信息没有传递到源。不幸的是,跨度没有参数“来源”,所以有更好的方法吗?

我已经像这样定义了我的来源、图形和线条:

m1_source = ColumnDataSource(data=dict(x1=[],y1=[]))
m1_spans = ColumnDataSource(data=dict(x1=[]))    
p = figure(x_axis_type="datetime",title="",sizing_mode="fixed",height = 500,width = 1400)
p.line(x ="x1",y="y1",color = 'blue',source=m1_source)

然后我有一个 for 循环,理想情况下应该绘制多个跨度,每个 'i' 将是一个单独的时间戳:

for i in m1_spans.data['x1']:
    p.add_layout(Span(location=i,dimension='height',line_color='red',line_dash='solid',line_width=1))

这是从我的 update() 函数获取的:

m1_source.data = dict(
   x1=machine_1_vals['mpTimestamp'],y1=machine_1_vals['Value'])

m1_spans.data = dict( x1=ToolsDF.loc[ToolsDF['Value'] == float(vals['Tool_val'])]['Timestamp'])

我已经检查过了,m1_spans 确实成功返回了多个时间戳,所以错误不应该出现在这里

我感到困惑的原因是我的 p.line 将成功更新而没有问题,但它确实有一个 source 参数,而 span 没有。

我非常感谢您提供有关如何解决此问题的任何建议。 如果我应该提供更多信息,我深表歉意并可以根据需要进行更新,我只是尽量为您保持简短。

谢谢。

解决方法

Span 对象目前没有被 ColumnDataSource“供电”的能力。每个 Span 仅绘制一个跨度,由其自己的 location 属性指定。

您需要单独更新每个 location 对象上的 Span 属性才能更新它。或者,如果您绝对希望能够通过 CDS 驱动更新,您可以考虑使用 multi_linesegmentray 字形代替。这些都有不同的方式来配置其坐标,因此您必须查看哪种方式最适合您的用例。但它们都有一个权衡,即它们都没有 Span 支持的完整“无限范围”。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...