如何 link 散景布局中所有地块的轴?
How to link axes of all plots in a Bokeh layout?
我正在使用散景服务器设计散景布局。我正在定义两个主要列(见附图),并且我试图 link 右列上所有图的 x 轴。问题是:
我试图让这个应用程序尽可能动态化,这意味着根据案例研究,并非所有的图都可用,并且每个单独的图都是从一个单独的函数设置的
每个绘图对象都存储在一个列表中,我不知道如何访问它们的属性
参考图未知 先验 所以我看不出如何在 Bokeh doc 中实现示例 - 在其他换句话说,我需要先绘制所有的子图,然后得到相关的 x_range
所以我想知道是否可以设置 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()
我正在使用散景服务器设计散景布局。我正在定义两个主要列(见附图),并且我试图 link 右列上所有图的 x 轴。问题是:
我试图让这个应用程序尽可能动态化,这意味着根据案例研究,并非所有的图都可用,并且每个单独的图都是从一个单独的函数设置的
每个绘图对象都存储在一个列表中,我不知道如何访问它们的属性
参考图未知 先验 所以我看不出如何在 Bokeh doc 中实现示例 - 在其他换句话说,我需要先绘制所有的子图,然后得到相关的 x_range
所以我想知道是否可以设置 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()