Столбчатая диаграмма Джанго Боке со стеком
У меня есть следующий набор запросов:
<QuerySet [
{'Order_Type': 'Phone', 'Order_Priority': 'NA', 'Order_total': 2},
{'Order_Type': 'Web', 'Order_Priority': 'High', 'Order_total': 3},
{'Order_Type': 'Web', 'Order_Priority': 'Med', 'Order_total': 9}]>
Я хочу создать столбчатую диаграмму с пошаговым отображением, используя прямоугольник, который показывает общее количество заказов для каждого типа заказа; каждый столбец также будет показывать приоритет заказа с разбивкой (см. изображение).
введите описание изображения здесь
Я получаю сообщение об ошибке, потому что ось категориальных коэффициентов (в данном случае тип заказа) не уникальна. кто-нибудь может мне с этим помочь?
Проблема в том, что bokeh ожидает уникальные категориальные коэффициенты на оси x, но ваш исходный набор запросов содержал несколько записей для одного и того же Order _Type
. Чтобы исправить это, вам нужно сначала объединить ваши данные таким образом, чтобы каждое Order_Type
имело разбивку по Order_priority
значениям.
from bokeh.plotting import figure, show
from bokeh.models import ColumnDataSource
from collections import defaultdict
data = [
{'Order_Type': 'Phone', 'Order_Priority': 'NA', 'Order_total': 2},
{'Order_Type': 'Web', 'Order_Priority': 'High', 'Order_total': 3},
{'Order_Type': 'Web', 'Order_Priority': 'Med', 'Order_total': 9},
]
aggregated_data = defaultdict(lambda: defaultdict(int))
for entry in data:
order_type = entry['Order_Type']
order_priority = entry['Order_Priority']
aggregated_data[order_type][order_priority] += entry['Order_total']
order_types = list(aggregated_data.keys())
order_priorities = sorted({priority for values in aggregated_data.values() for priority in values})
source_data = {'Order_Type': order_types}
for priority in order_priorities:
source_data[priority] = [aggregated_data[order_type].get(priority, 0) for order_type in order_types]
source = ColumnDataSource(source_data)
p = figure(x_range=order_types, title="Stacked Order Chart")
colors = ["#c9d9d3", "#718dbf", "#e84d60"][:len(order_priorities)]
p.vbar_stack(order_priorities, x='Order_Type', source=source, color=colors, legend_label=order_priorities)
show(p)