Как связать оси всех участков в макете Bokeh? - PullRequest
0 голосов
/ 16 мая 2019

Я разрабатываю макет Bokeh, используя сервер Bokeh.Я определяю два основных столбца (см. Прикрепленное изображение) и пытаюсь связать ось X всех графиков в правом столбце.Проблемы заключаются в том, что:

  • Я пытаюсь сделать это приложение максимально динамичным, что означает, что в зависимости от тематического исследования будут доступны не все графики, а каждый человек.plot устанавливается из отдельной функции

  • Каждый объект графика хранится в списке, и я не знаю, как получить доступ к их свойствам

  • Ссылочный график неизвестен a priori , поэтому я не вижу, как реализовать пример в Bokeh doc - другими словами, мне нужно сначала построить все вспомогательные участкизатем получить соответствующий x_range

Так что мне было интересно, можно ли установить поведение связывания a posteriori после определения всех графиков в столбце (т. е.вывод plotDataset ниже).Моя интуиция состоит в том, чтобы пройтись по объектам, найти детей и установить x_range для первого графика, но я не знаю, как это сделать.

Ниже приведена упрощенная версия того, что я пытаюсьдостигать.В идеале я должен получить x_range первого графика fCol и применить его ко всем остальным графикам непосредственно перед return column(fCol)

. Любая идея будет высоко оценена!Кроме того, я довольно новичок в Python, поэтому, пожалуйста, кричите, если увидите что-то еще ужасное!

Спасибо

def plotTS(data, col):
    tTmp = []

    # A loop that defines each tab of the plot
    for i in range(len(col)):
        fTmp = figure()

        fTmp.circle(data[:]['time'], data[:][col[i]], color=color)

        # Append tab
        tTmp.append(Panel(child=fTmp))

    # Return the tabs
    return Tabs(tabs=tTmp)    

def plotDataset(data):
    col = ['NDVI', 'EVI'] # Name of the tabs

    fCol = []
    fCol.append(plotTS(data, col))

    # NOTE: I use an append approach because in reality plotTS is called more than once

    return column(fCol)

# General layout - I did not include the code for the left column
layout = row(leftColumn, plotDataset(data))

Ссылка на изображение

1 Ответ

0 голосов
/ 17 мая 2019

См. Код ниже (Bokeh v1.1.0).

from bokeh.models import Panel, Tabs, Column, Row
from bokeh.plotting import figure
from tornado.ioloop import IOLoop
from bokeh.server.server import Server
from bokeh.application import Application
from bokeh.application.handlers.function import FunctionHandler

def modify_doc(doc):

    leftColumn = Column(figure())

    def plotTS(data, col):
        tTmp = []

        for i in col:
            fTmp = figure()
            fTmp.circle(data['x'], data['y'], color='black')
            tTmp.append(Panel(child=fTmp, title = i))

        return Tabs(tabs=tTmp)    

    def plotDataset(data):
        col = ['NDVI', 'EVI'] 
        fCol = plotTS(data, col)

        shared_range = None
        for panel in fCol.tabs:
            fig = panel.child
            if shared_range is None:
                shared_range = fig.x_range
            else:
                fig.x_range = shared_range

        return Column(fCol)

    layout = Row(leftColumn, plotDataset(data = dict(x = [1, 2, 3], y = [1, 2, 3])))
    doc.add_root(layout)


io_loop = IOLoop.current()
server = Server(applications = {'/app': Application(FunctionHandler(modify_doc))}, io_loop = io_loop, port = 5002)
server.start()
server.show('/app')
io_loop.start()        
...