如果 x 轴值在版本更新后是分类的,则散景标签不会呈现

Bokeh labels don't render if x axis values are categorical after version update

我是 Bokeh 的新手(使用 v2.2.1),正在寻找标记每个数据点的解决方案。复制文档中显示的示例,我找不到 X 轴为字符串的解决方案,

import pandas as pd
from bokeh.models import LabelSet, ColumnDataSource
from bokeh.plotting import figure, show

output_file("weekday_val.html")

vals = pd.DataFrame({'weekday': ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'],
                     'Sales': [15, 25, 36, 17, 4]})

ds = ColumnDataSource(vals)

p = figure(x_range=vals['weekday'])
p.vbar(x='weekday', width=0.75, top='Sales', source=ds)

labels = LabelSet(x='weekday', y='Sales', text='Sales', source=ds, 
                  level='glyph',
                  x_offset=5, 
                  y_offset=5, 
                  render_mode='canvas')
p.add_layout(labels)

show(p)

它没有给出任何错误,但它没有像我预期的那样在垂直条的顶部打印标签。这个错误是我把Bokeh从v1.2.0升级到v2.1.1后才出现的。

LabelSet是否只取x轴的数值?是否有解决方法可以将其用于带字符串的 x 轴?

正如 Eugene Pakhomov 在评论中所说,2.2.1 中存在关于分类坐标和标签的问题。它将在 2.3 中修复,但与此同时,您可以用它们的索引替换您的分类值,并且注释将按预期呈现。

import pandas as pd
from bokeh.models import LabelSet, ColumnDataSource, Range1d
from bokeh.plotting import output_notebook, figure, show

output_notebook()

vals = pd.DataFrame({'weekday': ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'],
                     'Sales': [15, 25, 36, 17, 4],
                     'index' : range(5)}
                   )

ds = ColumnDataSource(vals)

# extend the y-range a bit more to give space to top label
p = figure(y_range=Range1d(0, 42), x_range=vals['weekday'], height=300)
p.vbar(x='weekday', width=0.75, top='Sales', source=ds)

labels = LabelSet(x='index', y='Sales', text='Sales', source=ds, 
                  level='glyph',
                  x_offset=5, 
                  y_offset=5, 
                  render_mode='canvas')

p.add_layout(labels)

show(p)