我正在尝试使用嵌套类别(x轴)绘制vbar_stacked(y轴)。我使用了来自Pandas的MultiIndex并传递给ColumnDataSource,但不知道如何在vbar_stack中指定“ x”。下面是我现在正在处理的代码。
预先感谢
import pandas as pd
from bokeh.models import ColumnDataSource, FactorRange
from bokeh.io import show, output_file
import numpy as np
from bokeh.plotting import figure, curdoc, output_file, show
output_file("stacked.html")
second_x = ['A', 'B', 'C', 'D']
first_x = ['one','two']
stacks = ["q", "w", "e"]
iterable = [first_x, second_x]
index = pd.MultiIndex.from_product(iterable, names=['first', 'second'])
df = pd.DataFrame(np.random.randn(len(stacks),len(first_x)*len(second_x)), index = stacks, columns= index)
source = ColumnDataSource(df)
h_index = df.columns.tolist()
p=figure(x_range=FactorRange(*h_index))
p.vbar_stack(x=WHAT SHOULD I PUT?, width=0.9, stackers=['q','w','e'], source = source)
This is the chart I want to generate it (I draw using Excel)
答案 0 :(得分:0)
Bokeh文档中有一些不错的示例,可以轻松地创建这些图表。我使用this来创建此示例。
from bokeh.core.properties import value
from bokeh.models import ColumnDataSource, FactorRange
from bokeh.io import show, output_file
from bokeh.plotting import figure, output_file, show
output_file("stacked.html")
second_x = ['A', 'B', 'C', 'D']
first_x = ['one','two']
q = [1, 2, 3, 4, 5, 6, 7, 8]
w = [8, 7, 6, 5, 4, 3, 2, 1]
e = [2, 4, 6, 8, 7, 5, 3, 1]
stacks = ['q', 'w', 'e']
factors = []
for first in first_x:
for second in second_x:
factors.append((first, second))
source = ColumnDataSource(data=dict(
x=factors,
q=q,
w=w,
e=e
))
p=figure(x_range=FactorRange(*factors), title='Chart')
p.yaxis.axis_label = "Axis Title"
p.xgrid.grid_line_color = None
p.vbar_stack(stacks, x='x', width=0.9, color=['blue', 'orange', 'gray'], source = source, legend=[value(x) for x in stacks])
show(p)
答案 1 :(得分:0)
以下是您想要的解决方案:我刚刚修改了您的随机数据框
import pandas as pd
from bokeh.models import ColumnDataSource, FactorRange
from bokeh.core.properties import value
from bokeh.io import show, output_file
import numpy as np
from bokeh.plotting import figure, curdoc, output_file, show
output_file("stacked.html")
second_x = ['A', 'B', 'C', 'D']
first_x = ['one', 'two']
stacks = ["q", "w", "e"]
iterable = [first_x, second_x]
index = pd.MultiIndex.from_product(iterable, names=['first', 'second'])
#new randomn generator to avoid negative numbers
df = pd.DataFrame(np.random.randint(5, size=(len(stacks), len(first_x) * len(second_x))), index=stacks, columns=index)
print(df)
# this creates the double axis
factors = [(f_x, s_x) for f_x in first_x for s_x in second_x]
source = ColumnDataSource(data=dict(
x = factors,
q = df.loc['q'].tolist(),
w = df.loc['w'].tolist(),
e = df.loc['e'].tolist()
))
h_index = df.columns.tolist()
p = figure(x_range=FactorRange(*h_index), title='Chart')
p.vbar_stack(stacks, x='x', width = 0.9, color=["blue", "red", "grey"], source = source,
legend=[value(x) for x in stacks])
p.yaxis.axis_label = "Axis Title"
p.xgrid.grid_line_color = None
p.legend.location = "top_center"
p.legend.orientation = "horizontal"
show(p)
输出df:
first one two
second A B C D A B C D
q 2 0 3 4 2 4 1 2
w 4 3 4 1 1 3 3 1
e 3 3 4 4 4 0 0 3
图形结果: