Seaborn 多变量图函数
多变量图,也叫做 “矩阵图” 或 “多变量关系图”。它其实是将数据集中不同的字段进行 “两两比较”(包括自己与自己对比)。对于多变量图来说,默认情况下它对角线上的图表是直方图,其他的都是散点图。
在 Seaborn 中,我们可以使用 pairplot() 函数来绘制一个多变量图。
语法:
sns.pairplot(data)说明:
data 用于定义数据部分,它是一个 DataFrame。
Seaborn 多变量图案例
Seaborn 内置了一个数据集 penguins,该数据集保存的是 344 只企鹅的相关数据,包括种类、岛屿、性别、体重等,部分内容如下图所示。需要注意的是,penguins 数据中存在一定的缺失值,不过这并不会影响我们绘制图表。

示例 1:Seaborn 绘制多变量图
import matplotlib.pyplot as plt
import seaborn as sns
# 设置
sns.set_theme(rc={'font.sans-serif': 'SimHei', 'axes.unicode_minus': False})
# 加载内置数据集
df = sns.load_dataset('penguins')
# 重命名列
column_map = {
'species': '种类',
'island': '岛屿',
'bill_length_mm': '喙长',
'bill_depth_mm': '喙深',
'flipper_length_mm': '鳍长',
'body_mass_g': '体重',
'sex': '性别'
}
df.rename(columns=column_map, inplace=True)
# 绘制图表
sns.pairplot(data=df)
# 显示
plt.show()运行之后,效果如下图所示。

分析:
可能小伙伴们会觉得很奇怪,penguin.csv 中明明有 7 个字段(或变量),为什么这里只会比较 4 个字段呢?这是因为 pariplot() 函数只会对数值型的字段进行两两比较,然后找出它们之间的关系。而 “种类、岛屿、性别” 这 3 个字段并非是数值型字段,它们之间比较其实也没有什么意义。
还有一个疑问就是:为什么对角线要用直方图来表示,而不是使用散点图来表示呢?其实小伙伴们仔细观察对角线图表对应的 x 轴和 y 轴坐标就知道了,对角线其实是变量 “自己与自己的比较”,如果使用散点图就没有什么意义了,因为散点图是找出两个变量的关系。但是使用直方图,我们还可以清楚查看自身数据分布情况,这是类似于双变量图的一个作用。
示例 2:添加区分
import matplotlib.pyplot as plt
import seaborn as sns
# 设置
sns.set_theme(rc={'font.sans-serif': 'SimHei', 'axes.unicode_minus': False})
# 加载内置数据集
df = sns.load_dataset('penguins')
# 重命名列
column_map = {
'species': '种类',
'island': '岛屿',
'bill_length_mm': '喙长',
'bill_depth_mm': '喙深',
'flipper_length_mm': '鳍长',
'body_mass_g': '体重',
'sex': '性别'
}
df.rename(columns=column_map, inplace=True)
# 绘制图表
sns.pairplot(data=df, hue='性别')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
hue='性别' 表示根据 “性别” 来进行区分。如果我们将 hue='性别' 改为 hue='种类',此时效果如下图所示。

当我们使用 hue 参数来添加区分时,此时对角线上使用了核密度图来显示。其实我们还可以使用 diag_kind='hist' 这个参数将核密度图强制改为直方图来显示。修改后的代码如下,此时效果如下图所示。
sns.pairplot(data=df, hue='性别', diag_kind='hist')

示例 3:散点外观
import matplotlib.pyplot as plt
import seaborn as sns
# 设置
sns.set_theme(rc={'font.sans-serif': 'SimHei', 'axes.unicode_minus': False})
# 加载内置数据集
df = sns.load_dataset('penguins')
# 重命名列
column_map = {
'species': '种类',
'island': '岛屿',
'bill_length_mm': '喙长',
'bill_depth_mm': '喙深',
'flipper_length_mm': '鳍长',
'body_mass_g': '体重',
'sex': '性别'
}
df.rename(columns=column_map, inplace=True)
# 绘制图表
sns.pairplot(data=df, hue='性别', markers=['o', 's'])
# 显示
plt.show()运行之后,效果如下图所示。

分析:
hue='性别' 表示使用 “性别” 来进行区分,由于 “性别” 的取值只有 2 种:雄性、雌性,所以对于 markers 来说,它也需要 2 种取值才行。markers=['o', 's'] 表示使用 “实心圆” 和 “实心正方形” 这 2 种形状来表示散点的外观。
如果我们将 hue='性别' 改为 hue='种类',由于 “种类” 的取值有 3 种:Adelie(阿德利企鹅)、Chinstrap(帽带企鹅)、Gentoo(巴布亚企鹅),此时对于 markers 来说,它也需要 3 种取值才行。修改后的代码如下,此时效果如下图所示。

示例 4:自定义比较字段
import matplotlib.pyplot as plt
import seaborn as sns
# 设置
sns.set_theme(rc={'font.sans-serif': 'SimHei', 'axes.unicode_minus': False})
# 加载内置数据集
df = sns.load_dataset('penguins')
# 重命名列
column_map = {
'species': '种类',
'island': '岛屿',
'bill_length_mm': '喙长',
'bill_depth_mm': '喙深',
'flipper_length_mm': '鳍长',
'body_mass_g': '体重',
'sex': '性别'
}
df.rename(columns=column_map, inplace=True)
# 绘制图表
sns.pairplot(data=df, vars=['喙长', '喙深', '鳍长'])
# 显示
plt.show()运行之后,效果如下图所示。

分析:
vars=['喙长', '喙深', '鳍长'] 表示 x 轴和 y 轴都使用 “喙长、喙深、鳍长” 这 3 个字段,然后进行两两比较。当然了,我们也可以使用 x_vars 和 y_vars 来单独定义 x 轴和 y 轴使用的字段。修改后的代码如下,此时效果如下图所示。
sns.pairplot(
data=df,
x_vars=['喙长', '喙深', '鳍长'],
y_vars=['喙长', '喙深']
)

最后,我们来总结一下 pairplot() 函数的参数,常用的如下表所示。
| 参数 | 说明 |
|---|---|
| data | 数据部分 |
| hue | 添加区分(颜色) |
| diag_kind='hist' | 对角使用直方图 |
| markers | 散点外观 |
| vars | x 轴和 y 轴都使用的字段 |
| x_vars | x 轴使用的字段 |
| y_vars | y 轴使用的字段 |
