Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to plot bar stack in Pandas?

The objective is to plot a bar that stack as shown below using the Pandas builtin plot module

Expected Output

However, I cannot find any near example that tried to achieve similar objective.

The sample code that I am working is as below:

import pandas as pd
import matplotlib
import matplotlib.pyplot as plt  # noqa
matplotlib.use ('TkAgg')

data = {'name': ['Reg 1', 'Reg 1', 'Reg 1','Reg 2', 'Reg 2','Reg 2','Reg 2',
                 'Reg 3','Reg 3','Reg 3','Reg 3','Reg 3','Reg 4','Reg 4',],
        'year': ['a', 'b', 'c','a','a','b','c',
                 'a','a','b','c','d','f','f'],
        'reports': ['ay', 'by', 'cy','ay','ay','ay','cy',
                 'ay','ay','by','dy','dy','ry','rx']}

df = pd.DataFrame(data)
df_occ=df.apply(pd.Series.value_counts)
ax = df_occ.plot.bar(rot=0)
plt.show ()

Appreciate if someone can link to the appropriate reading material that I might miss. Also, I am open to other library that can achieve the aforementioned objective.

like image 687
rpb Avatar asked May 01 '26 19:05

rpb


1 Answers

Let's try:

fig, ax = plt.subplots(figsize=(10,6))
hatches = ['', '//']

bar_width = 0.45
names =set(df['name'])

for i, col in enumerate(['year','reports']):
    width = bar_width if i==0 else - bar_width
    s = pd.crosstab(df['name'], df[col])
    s.plot.bar(width=width, align='edge', stacked=True, ax=ax, edgecolor='w', hatch=hatches[i])
    
    for j, name in enumerate(names):
        ax.text(j + width/2, 0, col, ha='center')


    
xmin,xmax = ax.get_xlim()
ax.set_xlim(xmin-0.4, xmax+0.5)
ax.legend(loc=[1.05, 0])

Output:

enter image description here

like image 50
Quang Hoang Avatar answered May 03 '26 08:05

Quang Hoang



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!