Seaborn 箱线图

Seaborn 箱线图函数

在 Seaborn 中,我们可以使用 boxplot() 函数来绘制一个箱线图。箱线图的主要作用是:① 查看数据分布情况;② 判断是否有异常值。

语法:

sns.boxplot(data, x, y)

说明:

boxplot() 函数接收以下主要参数。

  • data(可选):用于定义数据部分,它是一个 DataFrame。
  • x(可选):用于指定 DataFrame 的哪一列作为 x 轴坐标。
  • y(可选):用于指定 DataFrame 的哪一列作为 y 轴坐标。

boxplot() 函数根据提供的 x 和 y 值绘制箱形图。箱形图通过显示数据的中位数、四分位数和异常值,提供了一种可视化数据分布的方式。

提示: Seaborn 还有一种更高级的箱线图,另请参阅:Seaborn 增强箱线图

示例 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],
    ['小军', 120]
]
df = pd.DataFrame(data, columns=['姓名', '年龄'])
# 绘图
sns.boxplot(data=df, y='年龄')

# 显示
plt.show()

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

Seaborn 箱线图

分析:

sns.boxplot(data=df, y='年龄') 表示使用 df 作为数据来源,然后 “年龄” 作为 y 轴坐标。从结果可以看出来,该箱线图存在一个异常值,也就是:120。对于箱线图来说,如果某一个数据并不处在大部分数据所在的范围,那么该数据就会自动被判断为一个异常值。

Seaborn 箱线图案例

Seaborn 内置了一个数据集 tips,该数据集保存的是某餐厅的营业情况,包括账单、小费、客人信息等,部分内容如下图所示。需要说明的是,“size” 这一列指的是客人订的餐桌类型,比如有些是 2 人桌、有些是 3 人桌等。

Seaborn tips 数据集

示例 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.boxplot(data=df, y='账单')

# 显示
plt.show()

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

Seaborn 绘制基本箱线图

分析:

sns.boxplot(y=df['账单']) 表示 y 轴坐标是 “账单” 这一列数据。对于这个例子来说,下面 2 种方式是等价的。

# 方式 1
sns.boxplot(data=df, y='账单')

# 方式 2
sns.boxplot(y=df['账单'])

如果想要使得箱线图是横向显示的,此时应该使用 x 这个参数,下面 2 种方式都可以实现。再次运行之后,效果如下图所示。

# 方式 1
sns.boxplot(data=df, x='账单')

# 方式 2
sns.boxplot(x=df['账单'])

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('tips')
# 重命名列
column_map = {
    'total_bill': '账单',
    'tip': '小费',
    'sex': '性别',
    'smoker': '是否吸烟',
    'day': '星期',
    'time': '餐段',
    'size': '人数'
}
df.rename(columns=column_map, inplace=True)

# 绘制图表
sns.boxplot(data=df, x='星期', y='账单')

# 显示
plt.show()

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

Seaborn 绘制多个箱线图

分析:

如果想要在画布上同时绘制多个箱线图,我们就必须指定 x 和 y 这两个参数。sns.boxplot(data=df, x='星期', y='账单') 这一句代表 x 轴是根据 “星期” 这一列来划分,然后 y 轴是不同时间对应的 “账单” (本质上是一个平均值)。由于 “星期” 这一列有 4 种取值:Thur(周四)、Fri(周五)、Sat(周六)、Sun(周日),所以这里会绘制 4 个箱线图出来。其中,每一个箱线图都是独立的。

对于多个箱线图来说,如果想要将纵向改为横向,我们直接将 x 和 y 的值调换就可以了。修改后的代码如下,此时效果如下图所示。

sns.boxplot(data=df, y='星期', x='账单')

Seaborn 多个箱线图横向显示

示例 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.boxplot(data=df, x='星期', y='账单', hue='性别')

# 显示
plt.show()

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

Seaborn 箱线图添加区分

分析:

对于箱线图来说,我们只能使用 hue 参数,而不能使用 style 或 size 这 2 个参数。boxplot() 函数和 barplot() 函数一样,都是只有 hue 参数,而没有 style 和 size 这 2 个参数。

hue='性别' 表示使用 “性别” 这一列作为类别的区分。如果将 hue='性别' 改为 hue='餐段',此时效果如下图所示。

Seaborn 箱线图 hue 参数

可能小伙伴会觉得很奇怪:为什么这里有些列有 2 个箱线图,而有些列只有 1 个箱线图呢?其实原因很简单,就拿 “周五” 来说,它既存在 “午餐” 也存在 “晚餐”,所以它有 2 个箱线图。而对于 “周六” 来说,它只有 “晚餐” 而没有 “午餐”,所以就只有 1 个箱线图。

示例 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.boxplot(data=df, x='星期', y='账单', order=['Sun', 'Sat', 'Fri', 'Thur'])

# 显示
plt.show()

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

Seaborn 箱线图改变顺序

分析:

其中,我们可以使用 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.boxplot(data=df, x='星期', y='账单')
sns.stripplot(data=df, x='星期', y='账单', color='black')

# 显示
plt.show()

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

Seaborn 箱线图结合分布散点图

分析:

对于箱线图来说,我们还可以使用分布散点图把每一个数据点展示在箱线图上。其中,stripplot() 函数用于绘制一个分布散点图。对于分布散点图,我们在后续章节中会详细介绍。

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

boxplot() 函数的参数
参数 说明
data 数据部分
x x 轴坐标
y y 轴坐标
hue 添加区分(颜色)
order 改变顺序

上一篇: Seaborn 直方图

下一篇: Seaborn 热力图

给站长反馈

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

邮箱:lvyenet@vip.qq.com

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