Search code examples
pythonpandasdata-visualizationseabornpie-chart

Seaborn catplot (kind='count') change bar chart to pie chart


I have the following looking df for my paper on corona-tracking-apps (pd.melt was used on it):

    CTQ-tool    opinion
0   Information and awareness purposes  unacceptable
1   Information and awareness purposes  unacceptable
2   Information and awareness purposes  acceptable
3   Information and awareness purposes  acceptable
4   Information and awareness purposes  unacceptable
... ... ...
2827    Central/Local data storage  NaN
2828    Central/Local data storage  NaN
2829    Central/Local data storage  NaN
2830    Central/Local data storage  NaN
2831    Central/Local data storage  NaN
2832 rows × 2 columns

I am using Seaborn library to make the following catplot:

code:

g = sns.catplot("opinion", col="CTQ-tool", col_wrap=4, data=df_original_small, kind="count", height=6.5, aspect=.8)

enter image description here

However, instead of displaying these in bar charts I would like to present them as pie charts. The Seaborn.catplot does not allow for something kind='count-pie'. Does anyone know a work around?

EDIT after TiTo question:

this is basicly what I want to see happen to all 8 bar charts:

enter image description here


Solution

  • I ended up using matplotlib library to build it up from the bottem:

    plt.style.use('seaborn')
    
    IAP = df_original_small['Information and awareness purposes'].value_counts().to_frame().T
    QE = df_original_small['Quarantine Enforcement'].value_counts().to_frame().T
    CTCR = df_original_small['Contact Tracing and Cross-Referencing'].value_counts().to_frame().T
    VPID = df_original_small['Voluntary provision of infection data'].value_counts().to_frame().T
    QMA = df_original_small['Quarantine Monitoring App'].value_counts().to_frame().T
    QRCode = df_original_small['QR code provided registration tracking'].value_counts().to_frame().T
    
    total = pd.concat([IAP, QE, CTCR, VPID, QMA, QRCode])
    
    fig, ax = plt.subplots(nrows=3, ncols=2)
    
    labels = 'acceptable', 'unacceptable'
    colors = ['#008fd5', '#fc4f30']
    explode = (0, 0.1)
    explode2 = (0.2, 0)
    
    plt.title('Pie chart per CTQ-tool')
    plt.tight_layout()
    
    ax[0,0].pie(total.iloc[[0]], startangle=90, colors=colors, wedgeprops={'edgecolor': 'black'}, autopct='%1.f%%', explode=explode, shadow=True)
    ax[0,0].set_title('Information and awareness purposes', fontweight='bold')
    ax[0,1].pie(total.iloc[[1]],  startangle=90, colors=colors, wedgeprops={'edgecolor': 'black'}, autopct='%1.f%%', explode=explode, shadow=True)
    ax[0,1].set_title('Quarantine Enforcement', fontweight='bold')
    ax[1,0].pie(total.iloc[[2]],  startangle=90, colors=colors, wedgeprops={'edgecolor': 'black'}, autopct='%1.f%%', explode=explode2, shadow=True)
    ax[1,0].set_title('Contact Tracing and Cross-Referencing', fontweight='bold')
    ax[1,1].pie(total.iloc[[3]], startangle=90, colors=colors, wedgeprops={'edgecolor': 'black'}, autopct='%1.f%%', explode=explode, shadow=True)
    ax[1,1].set_title('Voluntary provision of infection data', fontweight='bold')
    ax[2,0].pie(total.iloc[[4]], startangle=90, colors=colors, wedgeprops={'edgecolor': 'black'}, autopct='%1.f%%', explode=explode2, shadow=True)
    ax[2,0].set_title('Quarantine Monitoring App', fontweight='bold')
    ax[2,1].pie(total.iloc[[5]], startangle=90, colors=colors, wedgeprops={'edgecolor': 'black'}, autopct='%1.f%%', explode=explode, shadow=True)
    ax[2,1].set_title('QR code provided registration tracking', fontweight='bold')
    
    
    fig.suptitle('Public Opinion on CTQ-measures', fontsize=20, y=1.07, fontweight='bold', x=0.37)
    fig.set_figheight(10)
    fig.set_figwidth(7)
    fig.legend(loc='best', labels=labels, fontsize='medium')
    fig.tight_layout()
    
    fig.savefig('Opinions_ctq')
    
    plt.show()
    

    enter image description here