Matplotlib 柱状图函数
在 Matplotlib 中,我们可以使用 bar() 函数来绘制一个柱状图。柱状图也叫做 “柱形图”,它的主要作用是:展示数据的大小。
语法:
plt.bar(x, y, hatch)说明:
参数 x 存放的是所有点的 x 轴坐标,参数 y 存放的是所有点的 y 轴坐标,它们可以是列表、数组、Series 等。
参数 hatch 用于定义装饰线,常用的取值有:'/'、'|'、'-'、'\\'。每一种符号字符串代表一种几何样式,并且符号字符串的符号数量越多,几何图形的密集程度越高。
提示: 如果想要了解如何绘制 3D 条形图,另请参阅:Matplotlib 3D 条形图。
示例 1:基本柱状图
import matplotlib.pyplot as plt
# 绘图
x = [1, 2, 3, 4, 5]
y = [12, 25, 16, 23, 10]
plt.bar(x, y)
# 显示
plt.show()运行之后,效果如下图所示。

示例 2:装饰线
import matplotlib.pyplot as plt
# 绘图
x = [1, 2, 3, 4, 5]
y = [12, 25, 16, 23, 10]
plt.bar(x, y, hatch='/')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
符号的数量越多,几何图形的密集程度越高。当我们把 hatch='/' 改成 hatch='//' 之后,此时效果如下图所示。

当然了,小伙伴们可以自行试一下 hatch 的其他取值,然后看看每一种取值的效果是怎样的。
Matplotlib 柱状图案例
在当前项目下的 data 文件夹中有一个 gaokao.csv 文件,项目结构如下图所示。其中,gaokao.csv 文件保存的 2011 ~ 2020 这十年中每一年的高考人数(单位:万人),内容如下图所示。


示例 3:Matplotlib 柱状图应用
import pandas as pd
import matplotlib.pyplot as plt
# 设置
plt.rcParams['font.family'] = ['SimHei', 'PingFang SC']
plt.rcParams['axes.unicode_minus'] = False
# 读取数据
df = pd.read_csv('data/gaokao.csv')
# 绘制图表
plt.bar(df['年份'], df['人数'])
# 定义标题
plt.title('2011-2020年高考人数')
plt.xlabel('年份', loc='right')
plt.ylabel('人数(万人)', loc='top')
# 改变x轴刻度标签
plt.xticks(range(2011, 2021))
# 定义y轴刻度范围
plt.ylim(900, 1100)
# 添加注释文本
for a, b in zip(df['年份'], df['人数']):
plt.text(a, b, b, ha='center', va='bottom')
# 显示
plt.show()运行之后,效果如下图所示。

Matplotlib 柱状图高级应用
在实际开发中,柱状图的使用频率比较高。某些情况下,基本的柱状图并不能满足实际需求。所以我们还得掌握一些高级柱状图的绘制,主要包括以下 2 种。
- 堆叠柱状图。
- 并列柱状图。
示例 4:堆叠柱状图
import matplotlib.pyplot as plt
# 设置
plt.rcParams['font.family'] = ['SimHei', 'PingFang SC']
plt.rcParams['axes.unicode_minus'] = False
# 绘图
x = [1, 2, 3, 4, 5]
y1 = [3, 2, 4, 7, 1] # 男
y2 = [1, 5, 3, 8, 3] # 女
plt.bar(x, y1)
plt.bar(x, y2, bottom=y1)
# 定义标题
plt.title('婴儿出生人数(柱状图)')
plt.xlabel('日期')
plt.ylabel('人数')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
对于堆叠柱状图来说,多个数据的 x 轴坐标必须一致的,然后 y 轴坐标可以不相同。另外就是需要借助 bottom 这个参数,将放在下面的数据的 Y 轴坐标设置为 bottom 的值。
当然了,我们不仅仅可以实现 2 种数据的堆叠,还可以对更多数据进行堆叠,小伙伴们可以自行试一下。
示例 5:并列柱状图
import matplotlib.pyplot as plt
# 设置
plt.rcParams['font.family'] = ['SimHei', 'PingFang SC']
plt.rcParams['axes.unicode_minus'] = False
# 绘图
x = [1, 2, 3, 4, 5]
y1 = [11, 13, 16, 10, 6]
y2 = [12, 17, 15, 12, 5]
width = 0.3
x1 = x
x2 = [i+width for i in x]
plt.bar(x1, y1, width=width, label='广州')
plt.bar(x2, y2, width=width, label='深圳')
plt.legend()
# 定义标题
plt.title('气温变化(柱状图)')
plt.xlabel('日期')
plt.ylabel('温度')
# 定义刻度标签(将刻度放在两个柱子的正中间)
ticks_x = [i + width/2 for i in x]
dates = ['1日', '2日', '3日', '4日', '5日']
plt.xticks(ticks_x, dates)
# 显示
plt.show()运行之后,效果如下图所示。

分析:
如果想要绘制并列柱状图,主要是对 width 这个参数的灵活应用。最后关键代码是定义坐标轴的刻度。
Matplotlib 条形图
条形图是一种和柱状图非常类似的图表,它们之间最重要的区别就是:柱状图是纵向的,而条形图是横向的,就这么简单。
在 Matplotlib 中,我们可以使用 barh() 函数来绘制一个条形图。其中,barh 是 “bar horizontal” 的缩写。
语法:
plt.barh(x, y, hatch)说明:
barh() 和 bar() 这两个函数的参数是完全一样的。其中,x 和 y 用于定义坐标,hatch 用于定义装饰线。
示例 6:基本条形图
import matplotlib.pyplot as plt
# 绘图
x = [1, 2, 3, 4, 5]
y = [12, 25, 16, 23, 10]
plt.barh(x, y)
# 显示
plt.show()运行之后,效果如下图所示。

分析:
条形图的 barh() 函数和柱状图的 bar() 函数其他用法也是一样的。对于条形图来说,它同样可以实现堆叠条形图、并行条形图,小伙伴们可以自行尝试一下。
