问题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循环绘制垂直线的事实会产生小部件的问题,即:复选框仅对方形和圆形做出反应。
我想这是因为vert line是在没有source arg的情况下绘制的,因此通过JS回调发出更改并不会为它们更新数据(source是来自pandas dataframe的ColumDataSource)我无法按照它们使用的方式绘制它们来源arg。
问题2:假设我废弃了for循环,我无法操作文本的放置
有什么建议吗?
对文档的进一步检查使我发现了段和LabelSets,因此为了达到我想要的效果,我只需要添加一个由0组成的“零”列表到ColumnDataSource。
我确定还有很多其他方法来处理它。
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)