如何 link 散景布局中所有地块的轴?

How to link axes of all plots in a Bokeh layout?

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

所以我想知道是否可以设置 linking 行为 a posteriori 一旦定义了列中的所有图(即 [= 的输出12=] 下面)。我的直觉是遍历对象,获取子项并将 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

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