首页 > 解决方案 > 将标签放置在散景流图的顶角作为 python 示波器的简单方法

问题描述

我想在每个流图的左上角放置一个标签,无论是一个图,还是两个图等。这些图在两个方向上都被拉伸。现在,我必须根据显示的图数手动指定任何位置。(两个图 y=200,一个图 y=440)可以通过记录图中显示的 y 值的总范围来解决它,但感觉太 hacky。我想知道是否有一种简单的方法可以做到这一点。谢谢你的帮助。

在此处输入图像描述在此处输入图像描述

from bokeh.server.server import Server
from bokeh.models import ColumnDataSource, Label
from bokeh.plotting import figure
from bokeh.layouts import column
import numpy as np
import datetime as dt
from functools import partial
import time


def f_random():
    data = np.random.rand()
    data = (dt.datetime.now(), data)
    return data


def f_sinewave():
    data = np.sin(time.time()/1.)
    data = (dt.datetime.now(), data)
    return data


def make_document(doc, functions, labels):
    def update():
        for index, func in enumerate(functions):
            data = func()
            sources[index].stream(new_data=dict(time=[data[0]], data=[data[1]]), rollover=1000)
            annotations[index].text = f'{data[1]: .3f}'

    sources = [ColumnDataSource(dict(time=[], data=[])) for _ in range(len(functions))]
    figs = []
    annotations = []
    for i in range(len(functions)):
        figs.append(figure(x_axis_type='datetime', plot_width=800, plot_height=400, y_axis_label=labels[i]))
        figs[i].line(x='time', y='data', source=sources[i])
        annotations.append(Label(x=10, y=200, text='', text_font_size='20px', text_color='black',
                                 x_units='screen', y_units='screen', background_fill_color='white'))
        figs[i].add_layout(annotations[i])

    doc.add_root(column([fig for fig in figs], sizing_mode='stretch_both'))
    doc.add_periodic_callback(callback=update, period_milliseconds=100)


if __name__ == '__main__':
    # list of functions and labels to feed into the scope
    functions = [f_random, f_sinewave]
    labels = ['random', 'sinewave']

    server = Server({'/': partial(make_document, functions=functions, labels=labels)})
    server.start()
    server.io_loop.add_callback(server.show, "/")
    try:
        server.io_loop.start()
    except KeyboardInterrupt:
        print('keyboard interruption')

标签: bokehpython-3.7

解决方案


现在你可以这样做:

Label(x=10, y=figs[i].plot_height-30, ...)

似乎允许负值隐含地反对“对立面”将是一个很好的功能(对于新贡献者来说也是一个很好的第一个任务),所以我鼓励你提交一个关于它的GitHub 问题


推荐阅读