Как динамически обновить значение укладчиков в vbar_stack в боке? - PullRequest
0 голосов
/ 30 июня 2018

Боке версия: 0,13

Python версия: 3

Привет, у меня есть сценарий использования, в котором я использую vbar_stack для составления списка, скажем, подсчетов компаний, составленных за период дат. Это приложение в стиле боке, в котором ось X - это дата, а ось Y - это число.

Я смог динамически сгенерировать x-range этим p.x_range.factors = [] p.x_range.factors = list(dates)

Но так как список компаний также динамически меняется, как мне обновлять накопители во время выполнения.

Я думаю, что накопители не могут быть взяты из CDS, я застрял над этим. Я был бы очень признателен за любую помощь в этом.

Редактирует для дальнейшей разработки проблемы

Извините, если я не могу правильно выразить свою проблему, но вот что я пытаюсь сделать.

Это мой DataFrame с именами столбцов c1-c3 и их количеством

{
    "c1": [1, 2, 3],
    "c2": [1, 4, 6],
    "c3": [6, 2, 4],
    "dates": ['21-06-2018', '22-06-2018', '23-06-2018']
} 

Даты указаны по оси x, а c1-c3 сложены. Обратите внимание, что это работает на сервере (приложение). Пользователь может выбрать диапазон дат из раскрывающегося списка, поэтому даты, как и эти c1 ... cn, имеют динамический характер.

в настоящее время я использую эти 2 подхода:

  1. Я обновляю источник данных столбца и x_range p.x_range.factors = [], p.x_range.factors = list(dates) затем я снова вызываю vbar_stack, но это накладывается на предыдущие графики

  2. Я установил p.renderes = [], это решает проблему наложения, но очищает все панели инструментов заголовка оси и легенды. который я пытался явно установить, но он не работает

Мы недавно начали использовать Bokeh. Я не уверен, что использую правильный подход. Кто-нибудь может помочь в этом? Спасибо!

Approach 1 Approach 2

1 Ответ

0 голосов
/ 03 июля 2018

vbar_stack - буквально всего лишь ярлык для ручного определения нескольких Vbar с суммированными значениями. Если мы вручную определим vbars, позже будет легче добавить средства визуализации:

rendered_companies = []

def add_company_renderer(company):
    p.vbar(bottom=stack(*rendered_companies), top=stack(*(rendered_companies + [company]))
    rendered_companies.append(company)

for company in original_companies:
    add_company_renderer(company)

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

Ваш подход с повторным вызовом vbar_stack также должен работать, если вы удаляете не все средства визуализации, а только средства визуализации vbar. Я не проверял это, но должно работать следующее:

vbars = p.vbar_stack (...) ... def callback (): для vbar в vbars: p.renderers.remove (Vbar) p.vbar_stack (new_data ...)

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

Если вам также потребуется удалить компании позже, вы также можете сохранить созданные вручную vbar, например, в. продиктовать, а затем удалить их из сюжета, если это необходимо.

rendered_companies = []
renderers = {}

def add_company_renderer(company):
    vbar = p.vbar(bottom=stack(*rendered_companies), top=stack(*(rendered_companies + [company]))
    rendered_companies.append(company)
    renderers[company] = vbar

for company in original_companies:
    add_company_renderer(company)

def callback(company):
    renderer = renderers.get(company)
    if renderer:
          p.renderers.remove(renderer)
...