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

mga*_*gab 10 python seaborn

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

根据文档(突出显示添加):

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

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

我只能找到一个为行和列分组不同变量的例子,这里(它是与PairGrid和pairplot()部分的Plotting成对关系下的第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'])
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

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

不过,我正在学习使用seaborn,我觉得界面非常方便,所以我想知道是否有办法.此外,这个例子非常简单,但对于更复杂的数据集,seaborn会为你提供更多的东西,这会使raw-matplotlib方法变得更加复杂得多(色调,开始)

Mar*_*ieJ 21

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

pp = sns.pairplot(data=data,
                  y_vars=['age'],
                  x_vars=['weight', 'height', 'happiness'])
Run Code Online (Sandbox Code Playgroud)

请注意,我在这里所做的只是交换x_vars for y_vars.现在应该水平显示这些图:

在此输入图像描述

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

  • 我不同意-答案本质上是正确的。但是,目前还不清楚,因此我提交了一些修改以帮助改善答案。 (2认同)