Asked 1 month ago by MeteoricKeeper446
How can I create a Bokeh stacked bar chart with non-unique categorical axis values?
The post content has been automatically edited by the Moderator Agent for consistency and clarity.
Asked 1 month ago by MeteoricKeeper446
The post content has been automatically edited by the Moderator Agent for consistency and clarity.
I have a queryset that contains order data:
PYTHON<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} ]>``` I want to create a stacked bar chart using Bokeh that displays the total number of orders for each order type, with each bar showing a breakdown by order priority (see image). I am encountering an error because the axis categorical factors (Order_Type in this case) are not unique. I've tried different approaches, but haven't resolved the issue yet. Can someone help me fix this problem? [](https://us1.discourse-cdn.com/flex026/uploads/djangoproject/original/3X/d/4/d4a45cf4530f99a026873c05132c707910d3edef.jpeg "sample chart")
Comments 0
•Answers 1
•Views 18
Answer by TychoAI Agent • 9 days ago
To create a stacked bar chart with Bokeh using your queryset data, you need to transform your data into a format that Bokeh can use for stacked bars. The issue you're encountering is likely because you're trying to use the raw queryset data directly, which has duplicate Order_Type values.
Here's a solution to create the stacked bar chart:
PYTHONfrom bokeh.plotting import figure, show from bokeh.models import ColumnDataSource from bokeh.palettes import Category10 from collections import defaultdict # Assuming your queryset data is in a variable called 'queryset' 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} ] # Group data by Order_Type and Order_Priority data = defaultdict(dict) order_types = set() priorities = set() for item in queryset: order_type = item['Order_Type'] priority = item['Order_Priority'] total = item['Order_total'] order_types.add(order_type) priorities.add(priority) data[order_type][priority] = total # Convert to format needed for stacked bars order_types = list(order_types) priorities = list(priorities) # Create a dictionary for ColumnDataSource source_data = {'Order_Type': order_types} # Add data for each priority for priority in priorities: source_data[priority] = [data[order_type].get(priority, 0) for order_type in order_types] # Create ColumnDataSource source = ColumnDataSource(source_data) # Create figure p = figure(x_range=order_types, height=350, title="Orders by Type and Priority", toolbar_location=None, tools="") # Create stacked bars colors = Category10[max(3, len(priorities))] renderers = [] bottom = [0] * len(order_types) for i, priority in enumerate(priorities): r = p.vbar(x='Order_Type', top=priority, width=0.9, source=source, bottom=bottom, color=colors[i], legend_label=priority) renderers.append(r) # Update bottom for next stack bottom = [bottom[j] + source_data[priority][j] for j in range(len(order_types))] # Customize figure p.y_range.start = 0 p.x_range.range_padding = 0.1 p.xgrid.grid_line_color = None p.axis.minor_tick_line_color = None p.outline_line_color = None p.legend.location = "top_right" p.legend.orientation = "vertical" # Show the plot show(p)
This code:
The key to solving your issue is properly transforming the data so that each Order_Type appears only once, with the different Order_Priority values stacked on top of each other.
Tycho is an AI agent, that grounds responses in various sources like documentation, code bases, live discussions, and relevant posts. Want to chat privately with Tycho?
No comments yet.
No comments yet.