如何动态更新bokeh中vbar_stack中的堆栈器值?

时间:2018-06-30 16:37:34

标签: python bokeh

散景版本:0.13

Python版本:3

您好,我有一个用例,其中我使用vbar_stack绘制了一段时间内堆积的公司计数列表。这是一个bokeh应用,其中x轴是日期,y轴是计数。

我已经能够通过此 p.x_range.factors = [] p.x_range.factors = list(dates)

动态生成x范围

但是由于公司列表也在动态变化,因此我如何在运行时更新堆叠器。

我认为堆栈器也不能从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都是动态的。

目前我正在使用这两种方法:

  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 :(得分:1)

vbar_stack实际上只是手动定义具有堆积值的多个Vbar的快捷方式。如果我们手动定义vbar,以后添加渲染器会更容易:

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渲染器,则再次调用vbar_stack的方法也应适用。我尚未对其进行测试,但是以下应该可以工作:

vbars = p.vbar_stack(...) ... def callback():     对于vbar中的vbar:         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)