Боке: использовать один и тот же инструмент на нескольких фигурах - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть несколько фигур в столбце на графике боке.Я хочу применить одно и то же преобразование инструмента ко всем изображениям в одно и то же время, т. Е. Если я увеличу масштаб одной фигуры, все графики должны быть увеличены, если я перемещаю один, все они должны перемещаться, если я сбрасываю одно, они должны сбрасывать все(на самом деле не волнует парение, я был бы в восторге от масштабирования, панорамирования и сброса).

Есть ли способ связать фигуры в стиле боке или мне нужен какой-то собственный 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))

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Это в документации, под Связывание графиков .

TLDR: если вы хотите, чтобы графики разделяли диапазоны, то делитесь объектами их фактического диапазона:

# 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)
0 голосов
/ 20 сентября 2018

Вы должны создать объект 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))
...