pythonpandasmatplotlibseabornbar-chart

Using pandas crosstab to create a bar plot


I am trying to create a stacked barplot in seaborn with my dataframe.

I have first generated a crosstab table in pandas like so:

pd.crosstab(df['Period'], df['Mark'])

which returns:

  Mark            False  True  
Period BASELINE    583    132
       WEEK 12     721      0 
       WEEK 24     589    132 
       WEEK 4      721      0

I would like to use seaborn to create a stacked barplot for congruence, ans this is what I have used for the rest of my graphs. I have struggled to do this however as I am unable to index the crosstab.

I have been able to make the plot I want in pandas using .plot.barh(stacked=True) but no luck with seaborn. Any ideas how i can do this?


Solution

  • import numpy as np 
    import pandas as pd
    import seaborn as sns
    import matplotlib.pyplot as plt
    
    n = 500
    np.random.seed(365)
    mark = np.random.choice([True, False], n)
    periods = np.random.choice(['BASELINE', 'WEEK 12', 'WEEK 24', 'WEEK 4'], n)
    
    df = pd.DataFrame({'mark': mark, 'period': periods})
    ct = pd.crosstab(df.period, df.mark)
        
    ax = ct.plot(kind='bar', stacked=True, rot=0)
    ax.legend(title='mark', bbox_to_anchor=(1, 1.02), loc='upper left')
    
    # add annotations if desired
    for c in ax.containers:
        
        # set the bar label
        ax.bar_label(c, label_type='center')
    

    enter image description here