我正在使用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))
答案 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()