散景手动堆栈条形图缺少显示级别

Bokeh manual stack bar plot missing level in display

我尝试像在 matplotlib 中那样在散景中手动创建堆积条形图。代码有效,但输出图显示了一些我无法解释或解决的问题。对我来说,错误似乎总是出现在第二级,无论我有两个级别(即条数)还是三个级别堆叠。在三层图中,由于缺少第二层,颜色未匹配。

from bokeh.models import ColumnDataSource
from bokeh.plotting import figure, show
from bokeh.io import output_notebook
import numpy as np
output_notebook()

test_data = {
    'index' : np.array([1, 2, 3, 4, 5]),
    'a' : np.array([10, 20, 30, 40, 50]),
    'b' : np.array([10, 10, 10, 10, 10]),
    'c' : np.array([10, 10, 10, 10, 10])
}
s = ColumnDataSource(test_data)

alpha_lst = [1, 0.5, 0.1]
keys = list(s.data.keys())[1:-1]    # stack 2 levels/bars
# keys = list(s.data.keys())[1:]    # stack 3 levels/bars
w_bar = 0.9
level = 0  

p = figure(plot_width=600, plot_height=360)
for j in range(len(keys)):
    p.vbar(x=s.data['index'], bottom=level,
           top=level+s.data[keys[j]], width=w_bar, color='#43a2ca',
           line_color='#3A5785', fill_alpha=alpha_lst[j], legend_label=keys[j])
    level += s.data[keys[j]]
p.legend.location = 'top_left'

show(p)

堆叠条 2 级

堆叠条 3 级:

level += s.data[keys[j]]不好的两个原因:

  1. 您将变量类型从 int 更改为 numpy.array。我 maaaaybe 在这种情况下没问题,但通常它会让以后更难理解和调试
  2. 在它成为一个数组之后(即在第一个循环迭代结束时),该行的下一次执行会改变数组就地。意思是,由第二次调用 p.vbar 创建的 VBar 现在有 bottom,其值与 top.
  3. 相同

如何(以及是否)修复 #1 取决于您。要修复 #2,这将解决您的主要问题,只需将 level += s.data[keys[j]] 替换为 level = level + s.data[keys[j]]