Skip to content Skip to sidebar Skip to footer

Pandas: How To Draw A Bar Plot With Two Categories And Four Series Each?

I have the following dataframe, where pd.concat has been used to group the columns: a b C1 C2 C3 C4 C5 C6 C7 C8 0 15 37 17 10 8 11 1

Solution 1:

You could simply perform unstack after calculating the mean of the DF to render the bar plot.

import seaborn as sns
sns.set_style('white')

#color=0.75(grey)
df.mean().unstack().plot.bar(color=list('rbg')+['0.75'], rot=0, figsize=(8,8)) 

Image


Data: (As per the edited post)

df

Image

Prepare the multiindex DF by creating an extra column by repeating the labels according to the selections of columns(Here, 4).

df_multi_col = df.T.reset_index()
df_multi_col['labels'] = np.concatenate((np.repeat('A', 4), np.repeat('B', 4)))
df_multi_col.set_index(['labels', 'index'], inplace=True)
df_multi_col

Image

df_multi_col.mean(1).unstack().plot.bar(color=list('rbg')+['0.75'], rot=0, figsize=(6,6), width=2)

Image

Solution 2:

Try seaborn

import seaborn as sns
import pandas as pd

def r(df):
    return df.loc[df.name].reset_index(drop=True)

data = df.mean().groupby(level=0).apply(r) \
         .rename_axis(['grp', 'cat']).reset_index(name='mu')

ax = sns.barplot(x='grp', y='mu', hue='cat', data=data)

ax.legend_.remove()
for i, p in enumerate(ax.patches):
    height = p.get_height()
    ax.text(p.get_x() + .05, height + 1, df.columns.levels[1][i])

enter image description here

Post a Comment for "Pandas: How To Draw A Bar Plot With Two Categories And Four Series Each?"