首页 > 解决方案 > 散景:如何通过流动态显示 X 轴的标称值?

问题描述

我正在尝试运行一个简单的散景服务器,在那里我不断收到一个值和相应的字符串,并使用stream(). y 轴是实数,而 x 轴是我事先不知道的标称值。目前,我有类似这个例子的东西:

from bokeh.layouts import column, gridplot
from bokeh.models import ColumnDataSource
from bokeh.plotting import curdoc, figure
import random
import string


def update():
    global val
    val = int(val + 10 * random.randint(-100, 100)/50)
    s = ''.join(random.choice(string.ascii_letters))  # A random string I have no control over
    log.append(s)
    source.stream(new_data=dict(value=[val], time=[len(log)], log=[s]))


val = 100
log = []
source = ColumnDataSource(dict(value=[], time=[], log=[]))

p = figure()
p.x_range.follow = "end"
p.x_range.follow_interval = 200

p_curr = p.line(x='time', y='value', line_width=3, source=source)

curdoc().add_root(column(gridplot([[p]])))
curdoc().add_periodic_callback(update, 50)

运行: bokeh serve --show app.py

我唯一要更改的是,time该图不应显示整数(在我的情况下为列的值),而应为每个数据点显示s与其关联的值(即command列的值)。线本身的位置应该是相同的,只是每个 x 轴刻度都应该替换为从 each 派生的相应字符串update()

标签: pythonbokeh

解决方案


这可以通过使用SingleIntervalTicker和来完成FuncTickFormatter。后添加以下代码p = figure()

from bokeh.models import SingleIntervalTicker, FuncTickFormatter
p.xaxis.ticker = SingleIntervalTicker(interval=1, num_minor_ticks=0)
p.xaxis.formatter = FuncTickFormatter(args=dict(source=source), code='''
if(tick < 0){
    return '';
}
if(tick < source.data.log.length){
    return source.data.log[tick];
}
else{
    return '';
}
''')

推荐阅读