Nisha Pandey
Nisha Pandey

Reputation: 109

Create a stacked bar chart with grouping using pandas and bokeh

My dataset is like:

   Count     Date   teams sex
    39  2017/12/28    a   m
    26  2019/12/28    b   f
    3   2016/12/28    c   f
    8   2017/12/28    d   m
    1   2019/12/28    f   f
    22  2018/12/28    a   m
    26  2016/12/29    b   m

I want a stacked chart with sex as stacks and grouped across teams , each day, using bokeh plot.

I found an answer but its using old bokeh plot and is deprecated as of now.

from bokeh.charts import Bar, output_file, show

p = Bar(df, label='date', values='count', stack='class',  group='user',
    )

Upvotes: 2

Views: 1850

Answers (1)

bigreddot
bigreddot

Reputation: 34568

Bar was deprecated a long time ago, and subsequently removed completely. It cannot be used with any recent versions I would highly recommend against using it with old versions either.

Instead, there is an entire chapter of the user's guide that describes how to make all sorts of bar charts, including stacked and grouped bar charts: Handling Categorical Data

To create a stacked, grouped bar chart you need to specify nested categories together with vbar_stack

A complete example is in the docs but I have reproduced an abridged version here as well:

from bokeh.core.properties import value
from bokeh.io import show
from bokeh.models import ColumnDataSource, FactorRange
from bokeh.plotting import figure

factors = [
    ("Q1", "jan"), ("Q1", "feb"), ("Q1", "mar"),
    ("Q2", "apr"), ("Q2", "may"), ("Q2", "jun"),
    ("Q3", "jul"), ("Q3", "aug"), ("Q3", "sep"),
    ("Q4", "oct"), ("Q4", "nov"), ("Q4", "dec"),

]

regions = ['east', 'west']

source = ColumnDataSource(data=dict(
    x=factors,
    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 ],
))

p = figure(x_range=FactorRange(*factors), plot_height=250,
           toolbar_location=None, tools="")

p.vbar_stack(regions, x='x', width=0.9, alpha=0.5, color=["blue", "red"], source=source,
             legend=[value(x) for x in regions])

show(p)

enter image description here

Upvotes: 1

Related Questions