I am attempting to recreate the following plot from the book Introduction to Statistical learning using seaborn
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 yields
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}}
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 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.
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])
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With