Боке: использовать один и тот же инструмент на нескольких фигурах

1

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

Есть ли способ боке связывать цифры или мне нужен какой-то пользовательский 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))
  • 0
    Я откатил ваше преобразование вопроса в решение: найдите ваше решение в истории изменений и опубликуйте его как собственный ответ, спасибо.
Теги:
bokeh

2 ответа

1
Лучший ответ

Это указано в документации, в разделе " Связывание участков".

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)
1

Вы должны создать объект 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))
  • 0
    Это работало для выбора диапазона масштабирования, а не для фактического масштабирования или панорамирования.
  • 1
    Ах, верно. x_range и y_range также должны быть установлены, забыл об этом.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню