TMStack
TMStack

Reputation: 11

Plotting two Seaborn catplots in one figure

I am trying to plot the following data as a horizontal stacked barplot. I would like to show the Week 1 and Week 2, as bars with the largest bar size ('Total') at the top and then descending down. The actual data is 100 lines so I arrived at using Seaborn catplots with kind='bar'. I'm not sure if possible to stack (like Matplotlib) so I opted to create two charts and overlay 'Week 1' on top of 'Total', for the same stacked effect.

However when I run the below I'm getting two separate plots and the chart title and axis is one the one graph. Am I able to combine this into one stacked horizontal chart. If easier way then appreciate to find out.

Company Week 1 Week 2 Total
Stanley Atherton 0 1 1
Dennis Auton 1 1 2
David Bailey 3 8 11
Alan Ball 5 2 7
Philip Barker 3 0 3
Mark Beirne 0 1 1
Phyllis Blitz 3 0 3
Simon Blower 4 2 6
Steven Branton 5 7 12
Rebecca Brown 0 4 4

(Names created from random name generator)

Code:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline

data = pd.read_csv('Sample1.csv', delimiter="\t", error_bad_lines=False)

data_rank = data.sort_values(["Attending", "Company"], ascending=[False,True])

sns.set(style="ticks")

g = sns.catplot(y='Company', x='Total', data=data_rank, kind='bar', height=4, color='red', aspect=0.8, ax=ax)

ax2 =ax.twinx()
g = sns.catplot(y='Company', x='Week 1', data=data_rank, kind='bar', height=4, color='blue', aspect=0.8, ax=ax2)

for ax in g.axes[0]:
    ax.xaxis.tick_top()
    ax.xaxis.set_label_position('top')
    ax.spines['bottom'].set_visible(True)
    ax.spines['top'].set_visible(True)

plt.title("Company by week ", size=7)

catplot 1

catplot 2

Upvotes: 1

Views: 2640

Answers (1)

Mohil Patel
Mohil Patel

Reputation: 510

I think something like this works.

g = sns.barplot(y='Company', x='Total', data=data_rank, color='red', label='Total')
g = sns.barplot(y='Company', x='Week1', data=data_rank, color='blue', label='Week 1')
plt.title("Company by week ", size=12)
plt.xlabel('Frequency')
plt.legend()
plt.show()

enter image description here

Upvotes: 2

Related Questions