2 minute read

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'
          )

Tags: , ,

Categories: , ,

Updated: