【问题标题】:Bokeh: ploting multiple separate lines散景:绘制多条单独的线
【发布时间】:2019-07-13 10:43:43
【问题描述】:

第 1 期:

我想不出如何绘制除这块之外的多条单独线的方法:

main_time_line = p.line(x=(start, stop), y=(0, 0))

g1 = p.square(source=source, x='examination__date', y=0, size=4,
              color='black', name='g1')

hover_tool.renderers.append(g1)

g2 = p.circle(source=source, x='examination__date', y='level', size=15)

for i, (idate, ilevel, iname) in enumerate(zip(source.data['examination__date'],
                                               source.data['level'],
                                               source.data['examination__name'])):
    vert = 'top' if ilevel < 0 else 'bottom'
    horizontal = 'right' if ilevel < 0 else 'left'
    yoff = -10 if ilevel < 0 else 10
    p.line(x=idate, y=(0, ilevel), color='black', line_width=3)
    my_txt = Label(x=idate, 
                   y=ilevel, 
                   text=iname, 
                   text_align=horizontal,
                   text_baseline=vert, 
                   text_font_size='13px', 
                   y_offset=yoff)
    p.add_layout(my_txt)

上面的结果是:

视觉效果或多或少是我想要的,但是使用 for 循环绘制垂直线的事实给小部件带来了问题,即:复选框仅对方形和圆形有反应。

我猜这是因为垂直线是在没有源 arg 的情况下绘制的,因此通过 JS 回调发出更改不会更新它们的数据(源是来自 pandas 数据帧的 ColumDataSource) 在使用源 arg 时,我无法按原样绘制它们。

问题 2: 假设我废弃了 for 循环,我无法操作文本的放置

有什么建议吗?

【问题讨论】:

    标签: python django bokeh


    【解决方案1】:

    进一步检查文档让我发现了段和标签集,因此为了达到我想要的效果,我只需要在 ColumnDataSource 中添加一个由 0 组成的“零”列表。

    我相信还有很多其他方法可以处理它。

    main_time_line = p.line(x=(start, stop), y=(0, 0), color='blue')
    
    g1 = p.square(source=source, x='examination__date', y=0, size=4, 
                  color='black', name='g1')
    
    hover_tool.renderers.append(g1)
    
    g2 = p.circle(source=source, x='examination__date', y='level', size=15)
    
    g3 = p.segment(source=source, 
                   x0='examination__date', 
                   y0='zeroes',
                   x1='examination__date', 
                   y1='level',
                   color="#F4A582", 
                   line_width=3)
    
    labels = LabelSet(x='examination__date', y='level', text='examination__name', 
                      level='glyph', x_offset=5, y_offset=5, source=source, 
                      render_mode='canvas')
    
    p.add_layout(labels)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-26
      • 2017-06-13
      • 2020-07-28
      • 2021-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多