3

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.

1 Answer 1

4

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

Sign up to request clarification or add additional context in comments.

1 Comment

Hi @quang, thanks and this is almost perfect. One trivial request if you can put label 'year' and 'reports' at each bar.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.