У меня есть несколько цифр в столбце на участке боке. Я хочу применить одно и то же преобразование инструмента на всех изображениях одновременно, т.е. Если я увеличиваю масштаб на одну фигуру, все графики должны масштабироваться, если я панорамирую один, они должны все панорамироваться, если я сброшу один, все они должны быть сброшены (на самом деле не волнует зависание, я был бы в восторге от масштабирования, панорамирования и сброса).
Есть ли способ боке связывать цифры или мне нужен какой-то пользовательский Javascript для этого (если так, что бы это было)?
Заранее спасибо.
РЕДАКТИРОВАТЬ:
Спасибо @bigreddot и @Abhinav за решение. Вам нужны оба ответа, как описано здесь: Связывание сюжетов. Диапазон облегчает панорамирование, и один и тот же источник данных облегчает масштабирование,
Модифицированное решение из примера макетов:
from bokeh.io import output_file, show
from bokeh.layouts import column
from bokeh.plotting import figure
from bokeh.models import ColumnDataSource
from bokeh.models import PanTool,ResetTool,BoxZoomTool
output_file("layout.html")
x = list(range(11))
y0 = x
y1 = [10 - i for i in x]
y2 = [abs(i - 5) for i in x]
tools=[BoxZoomTool(), PanTool(), ResetTool()]
datasource = ColumnDataSource({'x': x, 'y0': y0, 'y1': y1, 'y2': y2})
# create a new plot
s1 = figure(plot_width=250, plot_height=250, title=None,tools=tools)
s1.circle('x', 'y0', size=10, color="navy", alpha=0.5, source=datasource)
# create another one
s2 = figure(plot_width=250, plot_height=250, title=None,tools=tools,x_range=s1.x_range,y_range=s1.y_range)
s2.triangle('x', 'y1', size=10, color="firebrick", alpha=0.5, source=datasource)
# create and another
s3 = figure(plot_width=250, plot_height=250, title=None,tools=tools,x_range=s1.x_range,y_range=s1.y_range)
s3.square('x', 'y2', size=10, color="olive", alpha=0.5, source=datasource)
# put the results in a column and show
show(column(s1, s2, s3))
Это указано в документации, в разделе " Связывание участков".
TL;DR: Если вы хотите, чтобы графики делились диапазонами, то делитесь своими действительными объектами диапазона:
# create a new plot
s1 = figure()
s1.circle(x, y0, size=10, color="navy", alpha=0.5)
# create a new plot and share both ranges
s2 = figure(x_range=s1.x_range, y_range=s1.y_range)
s2.triangle(x, y1, size=10, color="firebrick", alpha=0.5)
Вы должны создать объект ColumnDataSource из своих данных и использовать его при создании глифов на ваших рисунках. Пока цифры используют один и тот же источник данных, они будут иметь одинаковые инструментальные эффекты. При использовании ColumnDataSource
вам необходимо указать данные, используя имена столбцов в источнике данных, а не напрямую передавать сами массивы. Например:
from bokeh.io import output_file, show
from bokeh.layouts import column
from bokeh.plotting import figure
from bokeh.models import ColumnDataSource
from bokeh.models import PanTool,ResetTool,HoverTool,WheelZoomTool,SaveTool,BoxZoomTool
output_file("layout.html")
x = list(range(11))
y0 = x
y1 = [10 - i for i in x]
y2 = [abs(i - 5) for i in x]
#tools='hover,xpan,xwheel_zoom,box_zoom,save,reset'
tools=[HoverTool(),BoxZoomTool(dimensions='width'), PanTool(dimensions='width'), SaveTool(), ResetTool()]
datasource = ColumnDataSource({'x': x, 'y0': y0, 'y1': y1, 'y2': y2})
# create a new plot
s1 = figure(plot_width=250, plot_height=250, title=None,tools=tools)
s1.circle('x', 'y0', size=10, color="navy", alpha=0.5, source=datasource)
# create another one
s2 = figure(plot_width=250, plot_height=250, title=None,tools=tools)
s2.triangle('x', 'y1', size=10, color="firebrick", alpha=0.5, source=datasource)
# create and another
s3 = figure(plot_width=250, plot_height=250, title=None,tools=tools)
s3.square('x', 'y2', size=10, color="olive", alpha=0.5, source=datasource)
# put the results in a column and show
show(column(s1, s2, s3))