Seaborn 散点图函数
在 Seaborn 中,我们可以使用 scatterplot() 函数来绘制一个散点图。散点图的主要作用是:判断两个变量之间是否存在关联趋势。
通过观察散点图中数据点的分布,可以判断变量之间是否存在线性或非线性关系,以及是否存在异常值。散点图在以下情况下特别有用:
- 研究两个变量之间的相关性。
- 识别数据中的模式和趋势。
- 检测异常值。
语法:
sns.scatterplot(data, x, y)说明:
scatterplot() 函数接收以下主要参数。
data(可选):用于定义数据部分,它是一个 DataFrame。x(可选):用于指定 DataFrame 的哪一列作为 x 轴坐标。y(可选):用于指定 DataFrame 的哪一列作为 y 轴坐标。
scatterplot() 函数会根据提供的 x 和 y 值将数据点绘制在二维坐标系中。hue、style 和 size 参数可用于添加额外的维度来区分数据点。
提示: Seaborn 还有一种更高级的散点图,另请参阅:Seaborn 分布散点图。
示例 1:散点图指定 x 和 y
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 设置
sns.set_theme(rc={'font.sans-serif': 'SimHei', 'axes.unicode_minus': False})
# 数据
data = [
[1, 16],
[2, 18],
[3, 20],
[4, 21],
[5, 21],
[6, 23],
[7, 24],
[8, 24],
[9, 26],
[10, 27]
]
df = pd.DataFrame(data, columns=['A列', 'B列'])
# 绘图
sns.scatterplot(data=df, x='A列', y='B列')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
在这个例子中,我们指定 “A列” 这一列数据作为 x 轴坐标,并且指定 “B列” 这一列数据作为 y 轴坐标。从结果可以看出来,这两列数据存在一定的线性关系。
当然我们也可以不指定 x 和 y,但是需要使用 set_index() 方法将某一列指定为行名。这样行名部分就会成为 x 轴坐标,然后其他列就会成为 y 轴坐标。
此外,对于这个例子来说,下面 2 种方式是等价的。
# 方式 1
sns.scatterplot(data=df, x='A列', y='B列')
# 方式 2
sns.scatterplot(x=df['A列'], y=df['B列'])示例 2:散点图不指定 x 和 y
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 设置
sns.set_theme(rc={'font.sans-serif': 'SimHei', 'axes.unicode_minus': False})
# 数据
data = [
[1, 16],
[2, 18],
[3, 20],
[4, 21],
[5, 21],
[6, 23],
[7, 24],
[8, 24],
[9, 26],
[10, 27]
]
df = pd.DataFrame(data, columns=['A列', 'B列'])
# 指定行名部分
df.set_index('A列', inplace=True)
# 绘图
sns.scatterplot(data=df)
# 显示
plt.show()运行之后,效果如下图所示。

分析:
df.set_index('A列', inplace=True) 表示将 “A列” 这一列设置为行名。接下来我们使用 scatterplot() 绘制散点图时,“A列” 就会自动成为 x 轴坐标,然后其他列就会自动成为 y 轴坐标。
Seaborn 散点图案例
Seaborn 内置了一个数据集 tips,该数据集保存的是某餐厅的营业情况,包括账单、小费、客人信息等,部分内容如下图所示。需要说明的是,“size” 这一列指的是客人订的餐桌类型,比如有些是 2 人桌、有些是 3 人桌等。

示例 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('tips')
# 重命名列
column_map = {
'total_bill': '账单',
'tip': '小费',
'sex': '性别',
'smoker': '是否吸烟',
'day': '星期',
'time': '餐段',
'size': '人数'
}
df.rename(columns=column_map, inplace=True)
# 绘制图表
sns.scatterplot(data=df, x='账单', y='小费')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
sns.scatterplot(data=df, x='账单', y='小费') 表示将 “账单” 这一列设置为 x 轴坐标,并且将 “小费” 这一列设置为 y 轴坐标。如果我们想要加入 “餐段” 这一列作为区分,此时应该怎么做呢?我们可以接着看下面这个例子。
示例 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('tips')
# 重命名列
column_map = {
'total_bill': '账单',
'tip': '小费',
'sex': '性别',
'smoker': '是否吸烟',
'day': '星期',
'time': '餐段',
'size': '人数'
}
df.rename(columns=column_map, inplace=True)
# 绘制图表
sns.scatterplot(data=df, x='账单', y='小费', hue='餐段')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
对于 scatterplot() 函数来说,我们可以使用 hue、style、size 这 3 个参数来进行类别区分。小伙伴们需要非常清楚以下 3 点。
- hue、style、size 这 3 个参数的功能是一样的,只是表现的效果不一样。
- hue、style、size 这 3 个参数可以单独使用,也可以组合使用。
- 大多数绘图函数都有 hue 这个参数,但只有少数绘图函数才有 style 和 size 参数。
hue、style、size 这 3 个参数的作用是一样的,只是表现的效果不一样:hue 会使用不同的 “颜色” 来进行区分,style 会使用不同的 “形状” 进行区分,而 size 会使用不同的 “大小” 进行区分。
在这个例子中,hue 是根据 “餐段” 这一列进行区分。由于 “餐段” 这一列只有 2 种取值:“Lunch(午餐)” 和 “Dinner(晚餐)”。所以 scatterplot() 函数会使用 2 种不同的颜色进行区分。实际上,对于 hue、style、size 这 3 个参数,该列有多少种取值情况,就会使用多少种形式来表现。
对于这个例子来说,如果我们将 hue='餐段' 改为 style='餐段' 之后,此时效果如下图所示。

当我们将 hue='餐段' 改为 size='餐段' 之后,此时效果如下图所示。

当然了,我们还可以同时使用 hue、style、size 中的 2 个或 3 个。如果同时使用 hue 和 size,也就是执行下面这一句代码,此时效果如下图所示。
sns.scatterplot(data=df, x='账单', y='小费', hue='餐段', size='餐段')

上面都是使用 “餐段” 这一列作为区分,如果我们将 hue='餐段' 改为 hue='星期',也就是使用 “时间” 这一列作为区分,此时效果如下图所示。因为 “时间” 这一列的取值有 4 种:Thur(周四)、Fri(周五)、Sat(周六)、Sun(周日),所以就会使用 4 种不同的颜色进行区分。

如果使用 Matplotlib 来对散点图进行类别区分,实现起来是非常麻烦的。但是使用 Seaborn 却简单多了,只需要几个参数就可以。
我们来总结一下,如何选择 hue、style 和 size 参数。
- hue 参数通常用于区分分类变量,当分类变量的类别较少时,hue 可以有效地使用颜色来区分不同的类别。
- style 参数也用于区分分类变量,但它使用不同的标记形状。当需要在黑白打印或颜色不易区分的情况下显示数据时,style 参数非常有用。
- size 参数通常用于区分数值变量,它使用不同的大小来表示不同的数值。size 参数可以有效地显示数值变量的差异,并帮助观察数值变量对其他变量的影响。
示例 5:自定义 size
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('tips')
# 重命名列
column_map = {
'total_bill': '账单',
'tip': '小费',
'sex': '性别',
'smoker': '是否吸烟',
'day': '星期',
'time': '餐段',
'size': '人数'
}
df.rename(columns=column_map, inplace=True)
# 绘制图表
sns.scatterplot(data=df, x='账单', y='小费', hue='人数', size='人数')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
sns.scatterplot(data=df, x='账单', y='小费', hue='人数', size='人数') 表示使用不同颜色以及不同大小的圆点对 “人数” 这一列进行区分。但是从结果可以看出来,区分度其实是非常差的。
在实际开发中,如果觉得 size 参数默认大小的区分度不高,我们可以结合另一个参数 sizes 来进行自定义大小。我们修改为下面这一句代码,其中 sizes = (20, 200) 表示大小的范围在 20 ~ 200 之间,然后 Seaborn 会根据 size 取值有多少种来进行自动划分。再次执行代码之后,此时效果如下图所示。
sns.scatterplot(data=df, x='账单', y='小费', hue='人数', size='人数', sizes=(20, 200))

最后,我们来总结一下 scatterplot() 函数的参数,常用的如下表所示。
| 参数 | 说明 |
|---|---|
| data | 数据部分 |
| x | x 轴坐标 |
| y | y 轴坐标 |
| hue | 添加区分(颜色) |
| style | 添加区分(形状) |
| size | 添加区分(大小) |
| sizes | 自定义大小 |
