Простой способ разместить ярлык в верхнем углу потоковых графиков боке - PullRequest
0 голосов
/ 01 мая 2020

Я хочу разместить метку в верхнем левом углу каждого потокового графика, будь то один график или два графика и т. Д. c. Участки растянуты в обе стороны. На данный момент я должен вручную указать любое положение в зависимости от того, сколько графиков показано. (y = 200 для двух графиков и y = 440 для одного графика) Можно решить эту проблему, записав полный диапазон значений y, показанных на графике, но он кажется слишком хакерским. Мне интересно, есть ли простой способ сделать это. Спасибо за любую помощь.

enter image description hereenter image description here

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')

1 Ответ

1 голос
/ 01 мая 2020

На данный момент вы можете сделать:

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

Кажется, что позволить отрицательным значениям неявно позиционироваться против "противоположной" стороны было бы хорошей функцией (и хорошей первой задачей для новых участников), поэтому Я бы посоветовал вам подать GitHub проблему об этом.

...