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

标签 python bokeh pandas-bokeh

我尝试使用 ColumnDataSource 更新 Span,但信息未传递到源。不幸的是,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 属性指定。

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

关于python - 如何使用ColumnDataSource更新Span(Bokeh)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66498969/

相关文章:

python - 更改 pandas 绘图后端以获取交互式绘图而不是 matplotlib 静态绘图

Python生成具有随机步长的范围数组

python - 使用 HoverTool() 工具时仅显示一个工具提示

python - 无法通过回调清除多行图形

python - 如何在 Bokeh 悬停格式化程序上设置自定义日期时间模式?

Python Bokeh : Plotting same chart multiple times in gridplot

python - Python Bokeh 数据集的时间线 slider

python - python类的所有语句在没有对象创建的情况下执行

python - 从azure应用程序服务中的jupyter笔记本内核获取日志

python - 使用带有 lxml 前缀的 fromstring()