Seaborn 多变量图

Seaborn 多变量图函数

多变量图,也叫做 “矩阵图” 或 “多变量关系图”。它其实是将数据集中不同的字段进行 “两两比较”(包括自己与自己对比)。对于多变量图来说,默认情况下它对角线上的图表是直方图,其他的都是散点图

在 Seaborn 中,我们可以使用 pairplot() 函数来绘制一个多变量图。

语法:

sns.pairplot(data)

说明:

data 用于定义数据部分,它是一个 DataFrame。

Seaborn 多变量图案例

Seaborn 内置了一个数据集 penguins,该数据集保存的是 344 只企鹅的相关数据,包括种类、岛屿、性别、体重等,部分内容如下图所示。需要注意的是,penguins 数据中存在一定的缺失值,不过这并不会影响我们绘制图表。

Seaborn 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()

运行之后,效果如下图所示。

Seaborn 多变量图

分析:

可能小伙伴们会觉得很奇怪,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()

运行之后,效果如下图所示。

Seaborn 多变量图添加区分

分析:

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

Seaborn 多变量图 hue='种类'

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

sns.pairplot(data=df, hue='性别', diag_kind='hist')

Seaborn 多变量图改用直方图

示例 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()

运行之后,效果如下图所示。

Seaborn 多变量图散点外观

分析:

hue='性别' 表示使用 “性别” 来进行区分,由于 “性别” 的取值只有 2 种:雄性、雌性,所以对于 markers 来说,它也需要 2 种取值才行。markers=['o', 's'] 表示使用 “实心圆” 和 “实心正方形” 这 2 种形状来表示散点的外观。

如果我们将 hue='性别' 改为 hue='种类',由于 “种类” 的取值有 3 种:Adelie(阿德利企鹅)、Chinstrap(帽带企鹅)、Gentoo(巴布亚企鹅),此时对于 markers 来说,它也需要 3 种取值才行。修改后的代码如下,此时效果如下图所示。

Seaborn 多变量图 hue='种类'

示例 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()

运行之后,效果如下图所示。

Seaborn 多变量图自定义比较字段

分析:

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

sns.pairplot(
    data=df, 
    x_vars=['喙长', '喙深', '鳍长'], 
    y_vars=['喙长', '喙深']
)

Seaborn 多变量图使用 x_vars 和 y_vars

最后,我们来总结一下 pairplot() 函数的参数,常用的如下表所示。

pairplot() 函数的参数
参数 说明
data 数据部分
hue 添加区分(颜色)
diag_kind='hist' 对角使用直方图
markers 散点外观
vars x 轴和 y 轴都使用的字段
x_vars x 轴使用的字段
y_vars y 轴使用的字段

上一篇: Seaborn 双变量图

下一篇: Seaborn 子图

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号