Seaborn 柱状图函数
在 Seaborn 中,我们可以使用 barplot() 函数来绘制一个柱状图。柱状图的主要作用是:展示数据的大小,并比较不同类别之间的数值。
柱状图适用于比较不同类别之间的数值大小,它在以下情况下特别有用。
- 比较不同类别的数值。
- 显示随时间变化的数值。
- 分析分类数据。
不过柱状图也存在以下的局限性。
- 不适合显示连续变量之间的关系。
- 当类别过多时,柱状图会变得难以阅读。
语法:
sns.barplot(data, x, y)说明:
barplot() 函数接收以下主要参数。
data(可选):用于定义数据部分,它是一个 DataFrame。x(可选):用于指定 DataFrame 的哪一列作为 x 轴坐标。y(可选):用于指定 DataFrame 的哪一列作为 y 轴坐标。
barplot() 函数根据提供的 x 和 y 值绘制柱状图。如果 x 是分类变量,y 是数值变量,则柱状图显示每个类别的 y 的聚合值(默认情况下是平均值)。
提示: 与柱状图类似的是直方图,另请参阅: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 = [
['1月', 468],
['2月', 521],
['3月', 362],
['4月', 227],
['5月', 438],
['6月', 550]
]
df = pd.DataFrame(data, columns=['月份', '销量'])
# 绘图
sns.barplot(data=df, x='月份', y='销量')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
sns.barplot(data=df, x='月份', y='销量') 表示指定 “月份” 这一列数据作为 x 轴坐标,并且指定 “销量” 这一列数据作为 y 轴坐标。
对于柱状图来说,它的 x 轴坐标可以是数字也可以是字符串。但是 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.barplot(data=df, x='星期', y='账单')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
对于这个例子来说,x 轴坐标是 “星期”,取值共有 4 种:Thur(周四)、Fri(周五)、Sat(周六)、Sun(周日)。然后 y 轴坐标是 “账单”。有小伙伴可能会觉得很奇怪,“账单” 这个数值是怎么来的呢?
实际上,这里的 “账单” 取的是平均值。比如 “Thur(周四)” 对应的 “账单”,就是将所有Thur(周四)的账单进行求平均值。
示例 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.barplot(data=df, y='星期', x='账单')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
对于 barplot() 函数来说,我们只需要将 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.barplot(data=df, x='星期', y='账单', hue='性别')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
和折线图一样,如果想要给柱状图添加类别区分,我们也可以使用 hue 参数来实现。需要注意的是,对于 barplot() 函数,我们只能使用 hue 参数,而不能使用 style 或 size 参数。
原因很简单,柱状图根据颜色进行区分,这个是没有问题的。但是它是没办法通过形状(style)或大小(size)来进行区分的。也就是说,barplot() 函数只有 hue 参数,不存在 style 和 size 这 2 个参数。
示例 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.barplot(data=df, x='星期', y='账单', hue='是否吸烟')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
当我们使用 hue 参数添加区分之后,就会在同一列中使用不同的柱条来显示。如果想要在同一个柱条中显示,我们可以设置 dodge 参数的值为 False。修改后的代码如下,此时效果如下图所示。
sns.barplot(data=df, x='星期', y='账单', hue='是否吸烟', dodge=False)

需要注意的是,当左边柱条比右边柱条高时,那么左边柱条就会把右边柱条给 “遮住”。所以在实际开发中,这种合并显示的效果并不是很好。
Seaborn 带误差棒的柱状图
细心的小伙伴可能都发现了,barplot() 函数绘制的柱状图中每一个柱条中间都有一个棒条,实际上这就是一个 “带误差棒的柱状图”。
误差棒(error bar)用于表示数据的不确定性或变异性。它通常以柱状图上的垂直线段表示,显示数据的置信区间、标准差或标准误差。误差棒可以帮助我们评估数据的可靠性,并判断不同组之间的差异是否具有统计学意义。
在 barplot() 函数中,用于定义误差棒样式的参数有 2 个,如下表所示。
| 参数 | 说明 |
|---|---|
| err_kws | 棒条样式(颜色、宽度等) |
| capsize | 横杠大小 |
示例 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.barplot(data=df, x='星期', y='账单', err_kws={'color': 'purple'})
# 显示
plt.show()运行之后,效果如下图所示。

分析:
err_kws={'color': 'purple'} 表示定义棒条颜色为 purple(紫色)。当然了,我们也可以使用 err_kws 这个参数来改变棒条的宽度。修改后的代码如下,此时效果如下图所示。
sns.barplot(data=df, x='星期', y='账单', err_kws={'linewidth': 4, 'color': 'purple'})

如果想要添加一个横杠,我们只需要给 capsize 参数一个数值就可以了。修改后的代码如下,效果如下图所示。
sns.barplot(data=df, x='星期', y='账单', capsize=0.2)

最后,我们来总结一下 barplot() 函数的参数,常用的如下表所示。
| 参数 | 说明 |
|---|---|
| data | 数据部分 |
| x | x 轴坐标 |
| y | y 轴坐标 |
| hue | 添加区分 |
| order | 改变顺序 |
| dodge | 合并显示 |
| err_kws | 棒条样式 |
| capsize | 横杠大小 |
