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

Python 在水平图中使用seaborn pairplot比较1个独立变量和多个因变量,python,seaborn,Python,Seaborn,seaborn函数允许在数据集中绘制成对关系 根据文档(添加了突出显示): 默认情况下,此函数将创建轴网格,以便数据中的每个变量在y轴上跨一行共享,在x轴上跨一列共享。对角轴的处理方式不同,绘制一个图来显示该列中变量数据的单变量分布 还可以显示变量子集或在行和列上绘制不同的变量。 我只能找到一个为行和列设置不同变量子集的示例(这是使用PairGrid和pairplot()部分绘制两两关系下的第六个绘图)。如您所见,它将许多自变量(x_变量)与同一个因变量(y_变量)进行对比,结果非常好 我试着用

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

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

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

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

我只能找到一个为行和列设置不同变量子集的示例(这是使用PairGrid和pairplot()部分绘制两两关系下的第六个绘图)。如您所见,它将许多自变量(x_变量)与同一个因变量(y_变量)进行对比,结果非常好

我试着用同样的方法画出一个独立变量和许多相依变量

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'])
问题是子地块是垂直排列的,我找不到改变它的方法

我知道,这样瓷砖结构就不会像Y轴应该在每个子地块上标记一样整齐了。另外,我知道我可以手工生成这样的图:

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

不过,我正在学习使用seaborn,我发现界面非常方便,所以我想知道是否有办法。此外,这个示例非常简单,但是对于更复杂的数据集,seaborn为您处理了更多的事情,这些事情会使原始matplotlib方法非常快速地变得更复杂(首先是色调)

您可以通过交换传递给x_vars和y_vars参数的变量名来实现所需的功能。因此,重新访问代码的sns.pairplot部分:

pp = sns.pairplot(data=data,
                  y_vars=['age'],
                  x_vars=['weight', 'height', 'happiness'])
注意,我在这里所做的只是将x_变量交换为y_变量。绘图现在应水平显示:


现在,x轴对于每个绘图都是唯一的,y轴由年龄列确定。

PairGrid的要点是绘制多个绘图,其中变量跨轴共享,因此您无法将其用于您想要做的事情。这很公平。有没有什么方法可以像我尝试的那样使用这种
pandas
感知语法?如果你只是做散点图,那么使用pandas绘图方法应该很容易。我不同意-答案基本上是正确的。然而,这是相当不清楚,所以我已经提交了一些编辑,以帮助改善答案。