It is me
It is me

Reputation: 1

How to plot a stacked bar chart using Bokeh?

I was trying to plot a stacked bar chart from this data:

SYMBOL  COUNT    IMPACT
A  1       LOW
B  1       LOW
C  1       LOW
D  1       LOW
E  2       LOW
F  3       LOW
G  3       LOW
I  1       LOW
J  1  MODERATE
A  1  MODERATE
B  2  MODERATE
K  1  MODERATE
L  5  MODERATE
D  1  MODERATE
F  1  MODERATE
H  4  MODERATE
I  1  MODERATE
L  3      HIGH
E  1      HIGH
F  1      HIGH
G  1      HIGH

The idea is to make 3 bars (one per possible impact) and divide that bar into "SYMBOL". But I don't find the way of doing it without having to create manually a dictionary. Any help would be appreciated.

Upvotes: 0

Views: 784

Answers (1)

Cameron Riddell
Cameron Riddell

Reputation: 13407

You'll need to pivot your data, but you can achieve a stacked bar plot like so:

Data manipulation:

plot_df = (df.pivot(index="SYMBOL", columns="IMPACT", values="COUNT")
           .fillna(0)
           .rename_axis(columns=None))

print(plot_df)

        HIGH  LOW  MODERATE
SYMBOL                     
A        0.0  1.0       1.0
B        0.0  1.0       2.0
C        0.0  1.0       0.0
D        0.0  1.0       1.0
E        1.0  2.0       0.0
F        1.0  3.0       1.0
G        1.0  3.0       0.0
H        0.0  0.0       4.0
I        0.0  1.0       1.0
J        0.0  0.0       1.0
K        0.0  0.0       1.0
L        3.0  0.0       5.0

Plotting:

from bokeh.plotting import figure
from bokeh.palettes import Category10_3
from bokeh.io import show

symbols = list(plot_df.index)
impacts = list(plot_df.columns)

source = ColumnDataSource(plot_df)

p = figure(width=500, height=250, x_range=symbols)
p.vbar_stack(impacts, width=0.7, x="SYMBOL", source=source, color=Category10_3, legend_label=impacts)

p.y_range.start = 0
p.xgrid.grid_line_color = None
p.legend.location = "top_left"

show(p)

enter image description here

Upvotes: 1

Related Questions