在水平图中使用seaborn pairplot比较1个独立变量与多个因变量

时间:2015-08-12 13:22:03

标签: python seaborn

seaborn的pairplot函数允许在数据集中绘制成对关系。

根据文件(突出显示):

  

默认情况下,此函数将创建一个Axes网格,以便数据中的每个变量将在y轴上跨单个行共享,并在x轴上跨单个列共享。对角轴的处理方式不同,绘制一个图表以显示该列中变量数据的单变量分布。

     

还可以显示变量的子集或在行和列上绘制不同的变量。

我只能找到一个为行和列分组不同变量的例子,here(它是绘制与PairGrid和pairplot()部分的成对关系下的第6个图。如您所见,它正在针对同一个因变量( y_vars )绘制许多自变量( x_vars ),结果非常好。

我正在尝试对许多依赖变量绘制一个独立变量。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

ages = np.random.gamma(6,3, size=50)
data = pd.DataFrame({"age": ages,
                     "weight": 80*ages**2/(ages**2+10**2)*np.random.normal(1,0.2,size=ages.shape),
                     "height": 1.80*ages**5/(ages**5+12**5)*np.random.normal(1,0.2,size=ages.shape),
                     "happiness": (1-ages*0.01*np.random.normal(1,0.3,size=ages.shape))})

pp = sns.pairplot(data=data,
                  x_vars=['age'],
                  y_vars=['weight', 'height', 'happiness'])

问题是子图被垂直排列,我找不到改变它的方法。

enter image description here

我知道那时的平铺结构不会那么整洁,因为 Y 轴应该在每个子图上标记。另外,我知道我可以用这样的东西手工制作这些图:

fig, axes = plt.subplots(ncols=3)
for i, yvar in enumerate(['weight', 'height', 'happiness']):
    axes[i].scatter(data['age'],data[yvar])

尽管如此,我正在学习使用seaborn,我觉得界面非常方便,所以我想知道是否有办法。此外,这个例子非常简单,但是对于更复杂的数据集,seaborn会为您提供更多可以使 raw-matplotlib 方法更加复杂的事情( hue ,开始)

1 个答案:

答案 0 :(得分:15)

您可以通过交换传递给x_vars和y_vars参数的变量名称来实现您正在寻找的东西。所以重新访问代码的 sns.pairplot 部分:

pp = sns.pairplot(data=data,
                  y_vars=['age'],
                  x_vars=['weight', 'height', 'happiness'])

请注意,我在这里完成的所有工作都是针对y_vars交换x_vars。现在应该水平显示这些图:

enter image description here

x轴现在对于每个绘图都是唯一的,其共同的y轴由 age 列确定。