Seaborn 增强箱线图函数
在 Seaborn 中,我们可以使用 boxenplot() 函数来绘制一个 “增强版” 的箱线图。其中,boxenplot 就是 “box enhance plot” 的缩写。
对于 boxplot() 函数来说,它只能显示最大值、最小值、上四分位数、下四分位数、中位数以及异常值,如下图1所示。但是对于 boxenplot() 函数来说,它提供了更多分位数来表示,如下图2所示。


语法:
sns.boxenplot(data, x, y)说明:
boxenplot() 函数接收以下主要参数。
data(可选):用于定义数据部分,它是一个 DataFrame。x(可选):用于指定 DataFrame 的哪一列作为 x 轴坐标。y(可选):用于指定 DataFrame 的哪一列作为 y 轴坐标。
首先我们项目目录下的 data 文件夹中有一个 ages.csv,项目结构如下图所示。ages.csv 保存的 100 名乘客的年龄,部分内容如下图所示。


示例 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})
# 读取数据
df = pd.read_csv(r'data/ages.csv')
# 绘制图表
sns.boxenplot(data=df, y='age')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
sns.boxenplot(data=df, y='age') 表示使用 df 作为数据来源,然后 “年龄” 作为 y 轴坐标。
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.boxenplot(data=df, y='账单')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
sns.boxenplot(data=df, y='账单') 表示 y 轴坐标是 “账单” 这一列数据,此时增强箱线图是纵向的。如果想要使得增强箱线图是横向的,我们可以将 y='账单' 改为 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.boxenplot(data=df, x='星期', y='账单')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
如果想要在画布上同时绘制多个箱线图,我们就必须指定 x 和 y 这两个参数。sns.boxenplot(data=df, x='星期', y='账单') 这一句代表 x 轴是根据 “星期” 这一列来划分,然后 y 轴是不同星期对应的 “账单”。
对于多个增强箱线图来说,如果想要将纵向显示改为横向显示,我们直接将 x 和 y 的值调换就可以了。修改后的代码如下,此时效果如下图所示。
sns.boxenplot(data=df, y='星期', x='账单')

示例 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.boxenplot(data=df, x='星期', y='账单', hue='性别')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
对于 boxenplot() 函数来说,它只有 hue 参数,而没有 style 和 size 这两个参数。hue='性别' 表示使用 “性别” 这一列作为类别的区分。如果将 hue='性别' 改为 hue='餐段',此时效果如下图所示。

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

分析:
对于增强箱线图来说,我们同样可以使用分布散点图把每一个数据点展示在增强箱线图上。其中,stripplot() 函数用于绘制一个分布散点图。对于分布散点图,我们在下一节中会详细介绍。
boxenplot() 和 boxplot() 这两个函数的参数是一样的,常用的如下表所示。
| 参数 | 说明 |
|---|---|
| data | 数据部分 |
| x | x 轴坐标 |
| y | y 轴坐标 |
| hue | 添加区分(颜色) |
| order | 改变顺序 |
