从之前的学习可以知道,Seaborn 散点图 主要用于判断两个变量直接是否存在关联趋势。实际上散点图只能查看两个变量之间的关系,但有时我们还希望同时查看变量自身数据分布的情况,又应该怎么做呢?此时我们可以借助双变量图来实现。
Seaborn 双变量图函数
在 Seaborn 中,我们可以使用 jointplot() 函数来绘制一个双变量图。双变量图也叫做 “双变量关系图”,它会在中间处绘制一个散点图来表示两个变量的关系,并且在边缘处分别绘制一个描述变量自身数据分布的直方图。
语法:
sns.jointplot(data, x, y)说明:
data 用于定义数据部分,它是一个 DataFrame。x 用于指定 DataFrame 的哪一列作为 x 轴坐标,y 用于指定 DataFrame 的哪一列作为 y 轴坐标。
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.jointplot(data=df, x='喙长', y='喙深')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
从结果可以看出来,jointplot() 会在中央部分绘制两个变量的散点图,并且在边缘部分绘制单个变量的直方图。
示例 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.jointplot(data=df, x='喙长', y='喙深', hue='性别')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
hue='性别' 表示根据 “性别” 来进行区分。需要注意的是,此时对于单个变量的数据分布情况,使用的是 “Seaborn 核密度图” 来表示,而不是使用 “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.jointplot(data=df, x='喙长', y='喙深', kind='reg')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
默认情况下,双变量图中央部分是使用散点图来表示的。如果想要改变该图表类型,我们可以使用 kind 这个参数来实现。其中,参数 kind 的取值如下表所示。
| 取值 | 说明 |
|---|---|
| scatter(默认值) | 散点图 |
| reg | 回归图 |
| hist | 直方图 |
| kde | 核密度图 |
| hex | 六边形箱图 |
| resid | 回归图的残差 |
当我们使用 kind='hist' 时,效果如下图所示。

当我们使用 kind='kde' 时,效果如下图所示。

当我们使用 kind='hex' 时,效果如下图所示。

当我们使用 kind='resid' 时,效果如下图所示。

示例 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.jointplot(data=df, x='喙长', y='喙深', marker='x')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
如果想要改变散点的外观,我们可以使用 marker 这个参数来实现。其中,Seaborn 中的 marker 参数继承了 Matplotlib 中的 marker 参数,它们的取值是一样的。
最后,我们来总结一下 jointplot() 函数的参数,常用的如下表所示。
| 参数 | 说明 |
|---|---|
| data | 数据部分 |
| x | x 轴坐标 |
| y | y 轴坐标 |
| hue | 添加区分(颜色) |
| kind | 图表类型 |
| marker | 散点外观 |
