Я пытаюсь воспроизвести сгруппированную гистограмму abd сгруппированными в боке для категориальных данных, которые представлены в документации по боке здесь: https://docs.bokeh.org/en/latest/docs/user_guide/categorical.html#stacked и сгруппированы) Я хочу получить два категориальных уровня вместе сторона xaxis «день» и «категория». Я пытаюсь воспроизвести диаграмму для серии n.
Я получаю ошибку, которую не понимаю. Кажется, что мои входные данные имеют тот же формат, что и в примере в документации bokeh, за исключением того, что я хочу учесть n-столбцы, содержащие значения (в моем примере я представил 3, но я хочу, чтобы код был действительно для n столбцов).
возможно ли стек более 2-х серий?
почему мой код не работает?
Есть ли более эффективный способ сделать это?
МОЙ код:
import pandas as pd
import bokeh.io
from bokeh.io import output_file, show
from bokeh.models import ColumnDataSource, FactorRange
from bokeh.plotting import figure
data = [['Mon', '1' , 1.1 , 1.2 , 1.3 ],
['Mon', '2' , 2.1 , 2.2 , 2.3 ],
['Mon', '3' , 3.1 , 3.2 , 3.3 ],
['Tue', '1' , 4.1 , 4.2 , 4.3 ],
['Tue', '2' , 5.1, 5.2 , 5.3 ],
['Tue', '3' , 6.1 , 6.2 , 6.3 ]]
df = pd.DataFrame(data, columns = ['day', 'category','col_1','col_2','col_3'])
factors = list(df[['day','cat']].to_records(index=False))
factors_dict = {'x':factors}
series = list(df.columns)[2:]
series_dict = df.iloc[:,2:].to_dict('l')
data_dict = {**factors_dict,**series_dict}
source = ColumnDataSource(data_dict)
p = figure(x_range=FactorRange(*factors), plot_height=250,
toolbar_location=None, tools="")
p.vbar_stack(series, x='x', width=0.9, alpha=0.5, color=["blue", "red", "green"], source=source,
legend_label=series)
p.y_range.start = 0
p.y_range.end = 18
p.x_range.range_padding = 0.1
p.xaxis.major_label_orientation = 1
p.xgrid.grid_line_color = None
p.legend.location = "top_center"
p.legend.orientation = "horizontal"
show(p)
ОШИБКА
ValueError: expected an element of either Seq(String), Seq(Tuple(String, String)) or Seq(Tuple(String, String, String)),
got [('Mon', '1'), ('Mon', '2'), ('Mon', '3'), ('Tue', '1'), ('Tue', '2'), ('Tue', '3')]
факторы в примере bokeh docs
[('Q1', 'jan'),
('Q1', 'feb'),
('Q1', 'mar'),
('Q2', 'apr'),
('Q2', 'may'),
('Q2', 'jun'),
('Q3', 'jul'),
('Q3', 'aug'),
('Q3', 'sep'),
('Q4', 'oct'),
('Q4', 'nov'),
('Q4', 'dec')]
факторы в моем коде
[('Mon', '1'),
('Mon', '2'),
('Mon', '3'),
('Tue', '1'),
('Tue', '2'),
('Tue', '3')]
Факторы, которые я передаю x_range, имеют ту же форму, что и в примере, представленном в документации bokeh, однако Я получаю сообщение об ошибке, когда передаю их в x_range.
Кажется, что ColumnDataSource такой же, как и
{'x': [('Q1', 'jan'), ('Q1', 'feb'), ('Q1', 'mar'),
('Q2', 'apr'), ('Q2', 'may'), ('Q2', 'jun'),
('Q3', 'jul'), ('Q3', 'aug'), ('Q3', 'sep'),
('Q4', 'oct'), ('Q4', 'nov'), ('Q4', 'dec')],
'east': [5, 5, 6, 5, 5, 4, 5, 6, 7, 8, 6, 9],
'west': [5, 7, 9, 4, 5, 4, 7, 7, 7, 6, 6, 7]}
в моем примере
{'x': [('Mon', '1'), ('Mon', '2'), ('Mon', '3'),
('Tue', '1'), ('Tue', '2'), ('Tue', '3')],
'col_1': [1.1, 2.1, 3.1, 4.1, 5.1, 6.1],
'col_2': [1.2, 2.2, 3.2, 4.2, 5.2, 6.2],
'col_3': [1.3, 2.3, 3.3, 4.3, 5.3, 6.3]}