pandas plot multiple columns bar chart - grouped and stacked chart
In this article, we will see how to create a grouped bar chart and stacked chart using multiple columns of a pandas dataframe
Here are the steps that we will follow in this article to build this multiple column bar chart using seaborn and pandas plot function
- Create a test dataframe
- Build a grouped bar chart using pandas plot function
- Create a pivot table to create a stacked bar chart
- Build a multiple column bar chart using seaborn
Create a dataframe
We will first create a test dataframe with monetary details for an year. It has got four columns - month, sales, tax and profit.
df=pd.DataFrame(
{'month':
['jan', 'feb',
'mar', 'apr',
'may', 'jun',
'jul', 'aug',
'sep', 'oct',
'nov', 'dec'],
'sales': [45, 13, 28, 32,
40, 39, 26, 35,
22, 18, 42, 30],
'tax': [5, 2, 4, 6, 8, 7,
3, 5, 3, 2, 10, 6],
'profit': [40, 11, 24, 26, 32, 32,
23, 30, 32, 20, 8, 36]})
df
This is how our test dataframe looks like:
Month | Sales | Tax | Profit | |
---|---|---|---|---|
0 | jan | 45 | 5 | 40 |
1 | feb | 13 | 2 | 11 |
2 | mar | 28 | 4 | 24 |
3 | apr | 32 | 6 | 26 |
4 | may | 40 | 8 | 32 |
5 | jun | 39 | 7 | 32 |
6 | jul | 26 | 3 | 23 |
7 | aug | 35 | 5 | 30 |
8 | sep | 22 | 3 | 32 |
9 | oct | 18 | 2 | 20 |
10 | nov | 42 | 10 | 8 |
11 | dec | 30 | 6 | 36 |
Create a grouped bar chat with multiple columns
Pandas plot:
We will use pandas plot function and pass month column as x parameter and all other columns as list to y parameter
(df.plot(
x='month',
y=['sales','profit', 'tax-paid'],
kind='bar',
figsize=(5,5))
.legend( bbox_to_anchor =(1 ,1)
)
)
Horizontal bar plot:
Update the kind parameter to barh to create a horizontal bar chart
(df.plot(
x='month',
y=['sales','profit', 'tax-paid'],
kind='barh',
figsize=(5,5))
.legend( bbox_to_anchor =(1 ,1)
)
)
Pivot table plot:
We could also create the grouped bar chart with multiple columns by first creating a pivot table from the dataframe and then plot it
(
pd.pivot_table(
df,
index=['month'],
sort=False)
.plot(kind='bar',
figsize=(5,5))
.legend( bbox_to_anchor =(1 ,1)
)
)
Create a stacked bar chat
Just in case, you would like to plot the stacked bar chart of all those columns instead of a grouped bar chart, we could just add a stacked parameter in the pandas plot function to built it
(
pd.pivot_table(
df,
index=['month'],
sort=False)
.plot(kind='bar',
figsize=(5,5),
stacked = True)
.legend( bbox_to_anchor =(1 ,1)
)
)
#OR
(
df.plot(
x='month',
y=['sales','profit', 'tax-paid'],
kind='bar',
figsize=(5,5),
stacked=True)
.legend( bbox_to_anchor =(1 ,1)
)
)
Create a grouped bar chat using seaborn
Seaborn provides some easy to plot grouped bar charts functions, we need to first reshape the dataframe and melt it so that we have a dataframe in long format as shown here
df1=pd.melt(
df,
id_vars="month",
var_name="revenue",
value_name="amount"
)
df1
Month | Accounts_category | Amount | |
---|---|---|---|
0 | jan | sales | 45 |
1 | jan | tax-paid | 5 |
2 | jan | profit | 40 |
3 | feb | sales | 13 |
4 | feb | tax-paid | 2 |
5 | feb | profit | 11 |
6 | mar | sales | 28 |
7 | mar | tax-paid | 4 |
8 | mar | profit | 24 |
… | … | … | … |
To plot a grouped bar chart, we could use either seaborn barplot or catplot
fig, ax = plt.subplots(figsize=(8, 8), dpi=100)
sns.barplot(
x='month',
y='amount',
hue='revenue',
data=df1,
ax=ax
)
# OR
sns.catplot(
x='month',
y='amount',
hue='revenue',
data=df1,
kind='bar'
)