Как вызвать функцию JS или метод Python, когда глиф полностью отображается? - PullRequest
1 голос
/ 03 апреля 2019

Я использую bokeh в качестве серверного приложения. Когда я делаю выбор в графике, я делаю некоторые действия в Python и обновляю некоторые источники (CDS). Эти изменения отражены в сюжете. Есть ли способ проверить, когда глифы полностью отображаются (после обновления)? Я хочу вызвать функцию JavaScript, когда все полностью загружено? С помощью этой функции я хочу вызвать другой метод python для обновления CDS снова.

Если я не жду, когда будут отображены эти профили, возможно, приложение сломается, и это то, чего я хочу избежать. На самом деле, в прошлом я провел несколько тестов, и мне пришлось создать огромный CDS вместо нескольких меньших CDS, чтобы он работал правильно.

Мой вариант использования. Почему я хочу сделать это?

У меня много вкладок в макете, например, их может быть 10. И каждая вкладка имеет несколько графиков (3-6 участков). Если я обновлю весь ColumnDataSource одновременно, это займет некоторое время. Затем я хочу сделать его более свободным, поэтому я хотел бы обновить только данные текущей видимой вкладки, она будет рендериться быстрее, и пользователь получит немедленный ответ. Я могу временно отключить остальные вкладки, чтобы предотвратить сбои в работе. В этот момент мне нужно вызвать метод JS или python для обновления содержимого остальных вкладок.

Вот рисунок того, чего я хочу добиться, чтобы ускорить процесс:

drawing_steps

О данных

По сути, у меня есть два DataFrames, один для построения облака точек (около 5000 строк и 130 столбцов), и я извлекаю из выбранных точек другой DataFrame, чтобы знать, какие линии мне следует рисовать (360 столбцов и от 5 до 15 строк), сделать несколько фильтров и выборов. Алгоритм, который я использовал, находится в ответе на вопрос, который я написал некоторое время назад. С этим количеством данных алгоритм занимает 6 или 7 секунд, чтобы закончить.

Любая другая идея о том, как улучшить производительность или как разделить или вычисления?

1 Ответ

1 голос
/ 04 апреля 2019

Чтобы улучшить скорость рендеринга, вы можете попробовать webgl JavaScript API.Эта страница документации Bokeh Ускорение работы с WebGL объясняет, как это сделать.webgl поддерживает круги, линии и большинство маркеров.Приложение:

p = Plot(output_backend="webgl")  # for the glyph API
p = figure(output_backend="webgl")  # for the plotting API

Имейте в виду, что пользователи сообщают о проблемах с webgl, таких как заикание сюжета и т. Д., Но это может работать в вашем случае, в зависимости от того, какой тип глифов содержит ваш сюжет.

Также убедитесь, что ваши данные, передаваемые на график, не содержат NaN, поскольку, как известно, замедляют работу Bokeh.

Насколько мне известно, нет атрибута, который бы указывал, что рендерингзавершен или все еще продолжается , но вы можете подумать о некоторых других альтернативах для ускорения таких вещей, как сочетание Bokeh с Datashader (предварительный рендеринг больших наборов данных в растровое изображение фиксированного размера) или Dask (ускорение чтения данных из нескольких источников, например, из нескольких CSV-файлов)

Например, у вас может быть один стандартный график Bokeh, в котором вы делаете выбор и позволяете другим графикам генерироваться как Datashaderизображения и встраивать их в графики Bokeh.

В этом примере показано, как комбинировать Bokeh + Datashader, что значительно повышает производительность, особенно при наличии избыточного изображения.Обратите внимание, что каждый раз, когда к графику добавляется одна точка, вся область холста будет перерисовываться в браузере.Вот как работают браузеры.Datashader может предоставить одно изображение, поэтому обновление графика происходит намного быстрее, в то время как вы все еще можете использовать инструменты панели инструментов, такие как масштабирование, панорамирование и т. Д.

Также учитываются детали реализации кода Python.Использование, например, gridplot для связывания множества графиков может снизить производительность, поэтому лучше добавлять их один за другим в корневой каталог документа и т. Д. *

...