Seaborn 分布散点图函数
在 Seaborn 中,我们可以使用 stripplot() 函数来绘制一个分布散点图。分布散点图和普通的 “Seaborn 散点图” 不一样:普通散点图是用于判断两个变量是否存在关联趋势,而分布散点图是用于查看数据的分布情况。
语法:
sns.stripplot(data, x, y)说明:
strpplot() 函数接收以下主要参数。
data(可选):用于定义数据部分,它是一个 DataFrame。x(可选):用于指定 DataFrame 的哪一列作为 x 轴坐标。y(可选):用于指定 DataFrame 的哪一列作为 y 轴坐标。
示例 1:Seaborn 绘制分布散点图
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 = [
['张三', 24],
['李四', 18],
['王五', 37],
['小芳', 24],
['小红', 12],
['小明', 42],
['小华', 56],
['小莉', 67],
['小英', 45],
['小军', 82]
]
df = pd.DataFrame(data, columns=['姓名', '年龄'])
# 绘图
sns.stripplot(data=df, x='年龄')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
分布散点图其实是把每一个数据点都绘制在画布上,这样我们就可以非常直观地看出所有数据的分布情况。
Seaborn 分布散点图案例
Seaborn 内置了一个数据集 tips,该数据集保存的是某餐厅的营业情况,包括账单、小费、客人信息等,部分内容如下图所示。需要说明的是,“size” 这一列指的是客人订的餐桌类型,比如有些是 2 人桌、有些是 3 人桌等。

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

分析:
对于这个例子来说,x 轴坐标是 “账单” 的大小,然后表中每一个点都对应于 “账单” 这一列中的一个数据。
示例 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.stripplot(data=df, x='星期', y='账单')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
对于这个例子来说,x 轴坐标是 “星期”,取值共有 4 种:Thur(周四)、Fri(周五)、Sat(周六)、Sun(周日)。然后 y 轴坐标是 “账单”。由于 “星期” 共有 4 种取值,所以这里绘制了 4 个分布散点图出来,每一个小提琴图都是独立的。
对于这个例子来说,如果想要将分布散点图改为横向显示,我们只需要将 x 和 y 这两个参数的取值调换就可以了。修改后的代码如下,此时效果如下图所示。
sns.stripplot(data=df, 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.stripplot(data=df, x='星期', y='账单', hue='性别')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
对于 violinplot() 函数来说,它同样也是只有 hue 参数,而没有 style 和 size 这 2 个参数。所以想要添加区分,我们只能使用 hue 参数来实现。
如果想要把每一个区分都单独的使用一列来展示,我们可以使用 dodge=True 这个参数来实现。修改后的代码如下,此时效果如下图所示。
sns.stripplot(data=df, x='星期', y='账单', hue='性别', dodge=True)

示例 5:改变顺序
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.stripplot(data=df, x='星期', y='账单', hue='性别', order=['Sun', 'Sat', 'Fri', 'Thur'])
# 显示
plt.show()运行之后,效果如下图所示。

分析:
如果想要改变顺序,我们可以使用 order 参数来实现。
示例 6:结合箱线图
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.stripplot(data=df, x='星期', y='账单', color='black')
sns.boxplot(data=df, x='星期', y='账单')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
分布散点图还可以结合箱线图绘制在同一个画布上,此时就等于同时拥有分布散点图和箱线图的功能了。需要注意的是,对于分布散点图来说,我们需要使用 color 参数来重新定义颜色,因为默认的颜色会与箱线图颜色重叠,这样用户体验是比较差的。
对于这个例子来说,当我们把 color='black' 这个参数删除之后,此时可以看到效果如下图所示。

示例 7:结合增强箱线图
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.stripplot(data=df, x='星期', y='账单', color='black')
sns.boxenplot(data=df, x='星期', y='账单')
# 显示
plt.show()运行之后,效果如下图所示。

示例 8:结合小提琴图
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.boxenplot(data=df, x='星期', y='账单')
# 再画分布散点图(作为顶层,叠加在上面)
sns.stripplot(data=df, x='星期', y='账单', color='black')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
对于分布散点图来说,不管它是结合箱线图、增强箱线图还是小提琴图,绘图函数的调用是不区分顺序的。最后,我们来总结一下 stripplot() 函数的参数,常用的如下表所示。
| 参数 | 说明 |
|---|---|
| data | 数据部分 |
| x | x 轴坐标 |
| y | y 轴坐标 |
| hue | 添加区分(颜色) |
| dodge=True | 单独显示 |
| order | 改变顺序 |
提示: 如果希望所有的数据点都不重叠,我们可以使用 sns.swarmplot(),它会自动调整点的位置,形成像蜂群一样的效果,非常适合数据量适中的场景。
