Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Plotting multiple different plots in one figure using Seaborn

I am attempting to recreate the following plot from the book Introduction to Statistical learning using seaborn enter image description here

I specifically want to recreate this using seaborn's lmplot to create the first two plots and boxplot to create the second. The main problem is that lmplot creates a facetgrid according to this answer which forces me to hackily add another matplotlib axes for the boxplot. I was wondering if there was an easier way to achieve this. Below, I have to do quite a bit of manual manipulation to get the desired plot.

seaborn_grid = sns.lmplot('value', 'wage', col='variable', hue='education', data=df_melt, sharex=False) seaborn_grid.fig.set_figwidth(8)  left, bottom, width, height = seaborn_grid.fig.axes[0]._position.bounds left2, bottom2, width2, height2 = seaborn_grid.fig.axes[1]._position.bounds left_diff = left2 - left seaborn_grid.fig.add_axes((left2 + left_diff, bottom, width, height))  sns.boxplot('education', 'wage', data=df_wage, ax = seaborn_grid.fig.axes[2]) ax2 = seaborn_grid.fig.axes[2] ax2.set_yticklabels([]) ax2.set_xticklabels(ax2.get_xmajorticklabels(), rotation=30) ax2.set_ylabel('') ax2.set_xlabel('');  leg = seaborn_grid.fig.legends[0] leg.set_bbox_to_anchor([0, .1, 1.5,1]) 

Which yieldsenter image description here

Sample data for DataFrames:

df_melt = {'education': {0: '1. < HS Grad',   1: '4. College Grad',   2: '3. Some College',   3: '4. College Grad',   4: '2. HS Grad'},  'value': {0: 18, 1: 24, 2: 45, 3: 43, 4: 50},  'variable': {0: 'age', 1: 'age', 2: 'age', 3: 'age', 4: 'age'},  'wage': {0: 75.043154017351497,   1: 70.476019646944508,   2: 130.982177377461,   3: 154.68529299562999,   4: 75.043154017351497}}  df_wage={'education': {0: '1. < HS Grad',   1: '4. College Grad',   2: '3. Some College',   3: '4. College Grad',   4: '2. HS Grad'},  'wage': {0: 75.043154017351497,   1: 70.476019646944508,   2: 130.982177377461,   3: 154.68529299562999,   4: 75.043154017351497}} 
like image 732
Ted Petrou Avatar asked Jun 28 '16 17:06

Ted Petrou


People also ask

How do you make multiple subplots in Seaborn?

You can use the following basic syntax to create subplots in the seaborn data visualization library in Python: #define dimensions of subplots (rows, columns) fig, axes = plt. subplots(2, 2) #create chart in each subplot sns. boxplot(data=df, x='team', y='points', ax=axes[0,0]) sns.

How do you plot two Seaborn plots side-by-side?

How to plot two Seaborn lmplots side-by-side (Matplotlib)? To create two graphs, we can use nrows=1, ncols=2 with figure size (7, 7). Create a data frame with keys, col1 and col2, using Pandas. Use countplot() to show the counts of observations in each categorical bin using bars.


1 Answers

One possibility would be to NOT use lmplot(), but directly use regplot() instead. regplot() plots on the axes you pass as an argument with ax=.

You lose the ability to automatically split your dataset according to a certain variable, but if you know beforehand the plots you want to generate, it shouldn't be a problem.

Something like this:

import matplotlib.pyplot as plt import seaborn as sns  fig, axs = plt.subplots(ncols=3) sns.regplot(x='value', y='wage', data=df_melt, ax=axs[0]) sns.regplot(x='value', y='wage', data=df_melt, ax=axs[1]) sns.boxplot(x='education',y='wage', data=df_melt, ax=axs[2]) 
like image 195
Diziet Asahi Avatar answered Sep 22 '22 22:09

Diziet Asahi