Столбчатая диаграмма Джанго Боке со стеком

У меня есть следующий набор запросов:

<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)
Вернуться на верх