使用 Seaborn 在一个图中绘制多个不同的图
Posted
技术标签:
【中文标题】使用 Seaborn 在一个图中绘制多个不同的图【英文标题】:Plotting multiple different plots in one figure using Seaborn 【发布时间】:2016-10-31 03:47:58 【问题描述】:我正在尝试使用 seaborn 重新创建《Introduction to Statistical learning》一书中的以下情节
我特别想使用 seaborn 的 lmplot
创建前两个地块并使用 boxplot
创建第二个地块来重新创建它。主要问题是 lmplot 根据to this answer 创建了一个facetgrid
,这迫使我不得不为箱线图添加另一个matplotlib 轴。我想知道是否有更简单的方法来实现这一目标。下面,我必须做很多手动操作才能获得所需的情节。
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])
产生
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
【问题讨论】:
我想你想用PairGrid
。
【参考方案1】:
一种可能性是不使用lmplot()
,而是直接使用regplot()
。 regplot()
在您作为参数传递给 ax=
的轴上绘图。
您失去了根据某个变量自动拆分数据集的能力,但是如果您事先知道要生成的图,那应该不是问题。
类似这样的:
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])
【讨论】:
谢谢,我想我正在寻找一种更通用的解决方案,它允许构面网格包含额外的空白轴,以便将来进行额外的绘图。 lmplot 可能无法做到这一点。以上是关于使用 Seaborn 在一个图中绘制多个不同的图的主要内容,如果未能解决你的问题,请参考以下文章