散景版本:0.13
Python版本:3
您好,我有一个用例,其中我使用vbar_stack绘制了一段时间内堆积的公司计数列表。这是一个bokeh应用,其中x轴是日期,y轴是计数。
我已经能够通过此
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都是动态的。
目前我正在使用这两种方法:
我更新了列数据源和x_range p.x_range.factors = [], p.x_range.factors = list(dates)
然后我再次调用vbar_stack,但这是叠加在先前的图形上
我设置了p.renderes = []可以解决叠加问题,但是它清除了所有轴标题工具栏和图例。 我尝试过明确设置,但无法正常工作
我们最近开始使用Bokeh,我不确定我使用的方法是否正确 有人可以帮忙吗? 谢谢!
答案 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)