如何在散景布局中链接所有图的轴?

时间:2019-05-16 08:09:24

标签: python-3.x bokeh

我正在使用Bokeh服务器设计Bokeh布局。我正在定义两个主要列(请参见所附图像),并且尝试链接右列上所有图的x轴。问题是:

  • 我正在尝试使此应用程序尽可能地动态,这意味着根据案例研究,并非所有图都可用,并且每个图都由单独的函数设置

  • 每个绘图对象都存储在一个列表中,我不知道如何访问其属性

  • 参考图未知先验,所以我看不到如何在Bokeh doc中实现示例-换句话说,我需要先进行图所有子图,然后获得相关的x_range

所以我想知道,一旦定义了列中的所有图(即下面plotDataset的输出),是否可以设置链接行为后验。我的直觉是遍历对象,获取子对象并将x_range设置为第一个图,但是我不知道该怎么做。

下面是我要实现的目标的简化版本。理想情况下,我将获得fCol的第一个图的x_range并将其应用于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))

Link to image

1 个答案:

答案 0 :(得分:0)

请参见下面的代码(散景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()