Pandas Dataframe to Seaborn Grouped Barchart
The trick is to transform the pandas df
from wide to long format
Step 1: Prepare data
import seaborn as snsnp.random.seed(123)index = np.random.randint(1,100,10)x1 = pd.date_range('2000-01-01','2015-01-01').map(lambda t: t.strftime('%Y-%m-%d'))dts = np.random.choice(x1,10)benchmark = np.random.randn(10)portfolio = np.random.randn(10)df = pd.DataFrame({'Index': index, 'Dates': dts, 'Benchmark': benchmark, 'Portfolio': portfolio}, columns = ['Index','Dates','Benchmark','Portfolio'])
Step 2: From "wide" to "long" format
df1 = pd.melt(df, id_vars=['Index','Dates']).sort_values(['variable','value'])df1 Index Dates variable value9 48 2012-06-13 Benchmark -1.4103011 93 2002-07-31 Benchmark -1.3014898 97 2005-01-21 Benchmark -1.1009850 67 2011-06-01 Benchmark 0.1265264 84 2003-09-25 Benchmark 0.4656453 18 2009-07-13 Benchmark 0.5227425 58 2007-12-04 Benchmark 0.7249157 98 2002-12-28 Benchmark 0.7465816 87 2009-02-07 Benchmark 1.4958272 99 2000-04-21 Benchmark 2.20742716 87 2009-02-07 Portfolio -2.75022414 84 2003-09-25 Portfolio -1.85563715 58 2007-12-04 Portfolio -1.77945519 48 2012-06-13 Portfolio -1.77413411 93 2002-07-31 Portfolio -0.98486812 99 2000-04-21 Portfolio -0.74856910 67 2011-06-01 Portfolio -0.74765118 97 2005-01-21 Portfolio -0.69598117 98 2002-12-28 Portfolio -0.23415813 18 2009-07-13 Portfolio 0.240367
Step 3: Plot
sns.barplot(x='Dates', y='value', hue='variable', data=df1)plt.xticks(rotation=90)plt.ylabel('Returns')plt.title('Portfolio vs Benchmark Returns');