DATA VISUALIZATION · LEARNING SHOWCASE

第2章 · 使用 Matplotlib 绘制简单图表

基于《Python 数据可视化》课程课件整理的交互式学习成果展示。涵盖 10 大基础图表类型、10 个真实场景实例,将 PPT 中的静态示例还原为可交互的可视化作品。

折线图柱形图条形图堆积面积图 直方图饼图 / 圆环图散点图 / 气泡图 箱形图雷达图误差棒图
SCROLL ↓
00

学习目标

按照课件要求,本章需要熟练掌握 Matplotlib 基础绘图函数,能够根据数据特征选择合适的图表类型。

1

基础图表

掌握绘制折线图,绘制柱形图或堆积柱形图

2

分布与构成

掌握绘制条形图或堆积条形图,绘制堆积面积图、直方图

3

比例与关联

掌握绘制饼图或圆环图,绘制散点图或气泡图

4

统计图表

掌握绘制箱形图,绘制雷达图,绘制误差棒图

2.1

绘制折线图

使用 pyplot 的 plot() 函数可以快速地绘制折线图。fmt 是一个字符串,用于定义图的基本属性——颜色(color)、点型(marker)、线型(linestyle),具体形式为 fmt = '[color][marker][line]'。plot() 会返回包含 Line2D 类对象(代表线条)的列表;绘制多条线条时,可以多次调用 plot(),也可以一次传入多组 (x, y)。

语法 · Syntax
plot(x, y, fmt, scalex=True, scaley=True, data=None, label=None, *args, **kwargs) # x, y : 数据点的水平/垂直坐标 # fmt : '[color][marker][line]'
多线条绘制方式
第1种 plt.plot(x1, y1); plt.plot(x2, y2)
第2种 plt.plot(x1, y1, x2, y2)
第3种 plt.plot(arr[0], arr[1:])(传入二维数组)

实例 1 · 未来 15 天最高气温和最低气温

plot()
人们每天的生活离不开天气预报。将日期列作为 x 轴,最高气温与最低气温两列作为 y 轴,使用 plot() 函数绘制折线图,可直观对比昼夜温差变化趋势。
2.2

绘制柱形图或堆积柱形图

使用 pyplot 的 bar() 函数绘制柱形图或堆积柱形图。通过 bottom 参数传值可以控制柱形的 y 值,使后绘制的柱形位于先绘制的柱形上方(堆积);通过 xerr / yerr 参数可为柱形添加误差棒。bar() 返回一个 BarContainer 类对象,可遍历获取每个柱形,也可访问 patches / errorbar 属性。

语法 · Syntax
bar(x, height, width=0.8, bottom=None, align='center', tick_label=None, xerr=None, yerr=None, **kwargs) # height : 柱形的高度 # width : 柱形的宽度 # bottom : 柱形底部的 y 值(堆积关键)
四种形态
① 一组柱形:plt.bar(x, y1, ...)
② 两组柱形:plt.bar(x+bar_width, y2, ...)
③ 堆积柱形:plt.bar(x, y2, bottom=y1)
④ 误差棒:yerr=error

实例 2 · 2013~2019 财年阿里巴巴淘宝和天猫平台的 GMV

bar()
随着互联网与电子商务的快速发展,越来越多消费者选择网络购物。以财年为 x 轴、GMV 为 y 轴绘制柱形图(宽度 0.5),可看出 GMV 逐年增长,2019 财年突破 60000 亿元。
2.3

绘制条形图或堆积条形图

使用 pyplot 的 barh() 函数绘制条形图或堆积条形图。通过 left 参数传值控制条形的 x 值,使后绘制的条形位于先绘制的条形右方(堆积);通过 xerr / yerr 参数为条形添加误差棒。barh() 同样返回 BarContainer 类对象。

实例 3 · 各商品种类的网购替代率

barh()
国家统计局抽取了 771 个样本,测算用户网购替代率(网购用户线上消费对线下消费的替代比率)。以商品种类为 y 轴刻度标签、替代率为 x 轴,条形高度为 0.6,工艺品等服务的替代率位居前列。
语法 · Syntax
barh(y, width, height=0.8, left=None, align='center', *, **kwargs) # width : 条形的宽度(x 轴方向) # height : 条形的高度 # left : 条形左端的 x 值(堆积关键)
四种形态
① 一组条形:plt.barh(y, x1, ...)
② 两组条形:plt.barh(y+bar_height, x2)
③ 堆积条形:plt.barh(y, x2, left=x1)
④ 误差棒:xerr=error
2.4

绘制堆积面积图

使用 pyplot 的 stackplot() 函数绘制堆积面积图。labels 表示每个填充区域的标签;baseline 表示计算基线的方法,包括 zero、sym、wiggle 和 weighted_wiggle——其中 zero 表示恒定零基线(简单的叠加图),sym 表示对称于零基线,wiggle 表示最小化平方斜率之和。

语法 · Syntax
stackplot(x, y, labels=(), baseline='zero', data=None, *args, **kwargs) # x : x轴的数据,可以是一维数组 # y : y轴的数据,可以是二维数组 # 或一维数组序列
示例 · 三个填充区域堆叠
x = np.arange(6) y1 = np.array([1,4,3,5,6,7]) y2 = np.array([1,3,4,2,7,6]) y3 = np.array([3,4,3,6,5,5]) plt.stackplot(x, y1, y2, y3)

实例 4 · 物流公司物流费用统计

stackplot()
以月份为 x 轴刻度标签、A / B / C 三家公司的物流费用为 y 轴绘制堆积面积图。可看出 B 公司的物流费用呈现明显的增长趋势,A 公司和 C 公司的物流费用呈现平缓的波动趋势。
2.5

绘制直方图

使用 pyplot 的 hist() 函数绘制直方图。bins 表示矩形条的数量;histtype 表示直方图的类型('bar'、'barstacked'、'step'、'stepfilled',默认 'bar');density 表示是否将该直方图转为概率密度形式。

语法 · Syntax
hist(x, bins=None, range=None, density=None, weights=None, bottom=None, **kwargs) # x : 输入数据 # bins : 矩形条的数量 # histtype: 'bar' | 'barstacked' # 'step' | 'stepfilled'
示例 · 填充的线条直方图
# 准备50个随机测试数据 scores = np.random.randint(0, 100, 50) plt.hist(scores, bins=8, histtype='stepfilled')

实例 5 · 人脸识别的灰度直方图

hist()
人脸识别通过从人脸图像中抽取个性化特征来识别身份。使用 10000 个随机数作为人脸图像的灰度值,绘制包含 25 个矩形条的灰度直方图。由图可知,位于 -0.5~0 之间的灰度值最多,位于 -4~-3 或 3~4 之间的灰度值最少。
2.6

绘制饼图或圆环图

使用 pyplot 的 pie() 函数绘制饼图或圆环图。explode 表示各扇形离开圆心的距离;labels / autopct 表示扇形的标签 / 数值标记;pctdistance 表示数值标记距圆心的半径比例;startangle 表示起始角度;radius 表示扇形半径;wedgeprops 表示控制扇形属性的字典(如 width 可绘制圆环图)。

实例 6 · 支付宝月账单报告

pie()
支付宝拥有自动记录每月账单的功能,方便用户了解每月资金的流动情况。以分类为饼图标签、各分类金额与总支出金额的比例为饼图数据,起始角度为 90°,购物扇形离开圆心距离为 0.1 并显示阴影,餐饮美食占比最高。
语法 · Syntax
pie(x, explode=None, labels=None, autopct=None, pctdistance=0.6, startangle=None, *, data=None) # explode : 各扇形离开圆心的距离 # autopct : 数值标记格式 # startangle : 起始角度 # wedgeprops : {'width':0.7} → 圆环图
饼图 → 圆环图
# 饼图:半径1.5,数值保留1位小数 plt.pie(data, radius=1.5, labels=..., autopct='%3.1f%%') # 圆环图:加 wedgeprops 宽度 0.7 plt.pie(data, radius=1.5, wedgeprops={'width': 0.7}, labels=..., autopct='%3.1f%%', pctdistance=0.75)
2.7

绘制散点图或气泡图

使用 pyplot 的 scatter() 函数绘制散点图或气泡图。s 表示点的大小(气泡图的关键,传入面积数组);c 表示点的颜色;marker 表示点的形状;cmap 表示颜色映射表;linewidths / edgecolors 表示点的线条宽度 / 边缘颜色。

语法 · Syntax
scatter(x, y, s=None, c=None, marker=None, cmap=None, linewidths=None, edgecolors=None, *, **kwargs) # s : 点的大小(面积) # c : 点的颜色 # marker : 点的形状
散点图 → 气泡图
num = 50 x = np.random.rand(num) y = np.random.rand(num) plt.scatter(x, y) # 散点图 area = (30 * np.random.rand(num))**2 plt.scatter(x, y, s=area) # 气泡图

实例 7 · 汽车速度与制动距离的关系

scatter()
汽车的制动距离主要取决于车速。以车速(km/h)为 x 轴、制动距离(m)为 y 轴绘制散点图。由图可知,车速与制动距离呈非线性正相关——若车速增加 1 倍,则汽车的制动距离将增大至近 4 倍。
2.8

绘制箱形图

使用 pyplot 的 boxplot() 函数绘制箱形图。meanline 表示是否用横跨箱体的线条标出中位数;showcaps 表示是否显示箱体顶部和底部的横线;showbox / showfliers 表示是否显示箱体 / 异常值;labels 表示箱形图的标签;boxprops 表示控制箱体属性的字典。

实例 8 · 2017 年和 2018 年全国发电量统计

boxplot()
以发电量(亿千瓦时)为 x 轴、年份为 y 轴刻度标签,箱体宽度 0.5、填充颜色、横向摆放。由图可知,2017 年每月发电量大多分布于 4800~5300 亿千瓦时,2018 年每月发电量大多分布于 5250~5700 亿千瓦时。
语法 · Syntax
boxplot(x, notch=None, sym=None, vert=None, whis=None, positions=None, widths=None, *, data=None) # meanline : 中位数线条 # showfliers : 是否显示异常值 # widths : 箱体宽度 # vert : False → 横向摆放
示例 · 不显示异常值
data = np.random.randn(100) plt.boxplot(data, meanline=True, widths=0.3, patch_artist=True, showfliers=False)
2.9

绘制雷达图

使用 pyplot 的 polar() 函数绘制雷达图:theta 表示每个标记所在射线的角度,r 表示每个标记到圆心的距离。

实例 9 · 霍兰德职业兴趣测试

polar()
霍兰德职业兴趣测试由美国职业指导专家霍兰德编制,将人格分为研究型 (I)、艺术型 (A)、社会型 (S)、企业型 (E)、传统型 (C) 和现实型 (R) 6 个维度。由图可知:用户 1 偏向于现实型人格;用户 2 偏向于研究型人格;用户 3 偏向于艺术型人格;用户 4 偏向于企业型人格;用户 5 偏向于社会型人格;用户 6 偏向于传统型人格。
2.10

绘制误差棒图

使用 pyplot 的 errorbar() 函数绘制误差棒图。xerr / yerr 表示数据的误差范围;fmt 表示数据点的标记样式和连接线样式;ecolor 表示误差棒线条的颜色;capsize / capthick 表示误差棒边界横杠的大小 / 厚度。

语法 · Syntax
errorbar(x, y, yerr=None, xerr=None, fmt='', ecolor=None, *, data=None, **kwargs) # x, y : 数据点的位置 # yerr,xerr : 数据的误差范围 # capsize : 边界横杠的大小 # capthick : 边界横杠的厚度
示例
x = np.arange(5) y = (25, 32, 34, 20, 25) y_offset = (3, 5, 2, 3, 3) plt.errorbar(x, y, yerr=y_offset, capsize=3, capthick=2)

实例 10 · 4 个树种不同季节的细根生物量

errorbar()
细根生物量反映根系从土壤中吸收水分和养分的能力。以季节为 x 轴刻度标签、四个树种数据为 y 轴,结合柱形图添加误差棒。由图可知,杉木的细根生物量最多,说明杉木吸收水分和养分的能力最强;马尾松的细根生物量最少,说明马尾松吸收水分和养分的能力最弱。
2.11

本章小结

📊 十类图表 · 一网打尽

本章主要介绍了如何使用 matplotlib 库的绘图函数绘制简单的图表,包括折线图、柱形图或堆积柱形图、条形图或堆积条形图、堆积面积图、直方图、饼图或圆环图、散点图或气泡图、箱形图、雷达图、误差棒图。通过学习本章内容,希望大家能够掌握绘图函数的用法,可以使用这些函数绘制简单的图表,为后续的学习打好扎实的基础。

plot()bar()barh()stackplot()hist() pie()scatter()boxplot()polar()errorbar()
实例 1
未来 15 天最高气温和最低气温

折线图 · 天气预报

实例 2
2013~2019 财年阿里平台 GMV

柱形图 · 电商发展

实例 3
各商品种类的网购替代率

条形图 · 消费习惯

实例 4
物流公司物流费用统计

堆积面积图 · 行业趋势

实例 5
人脸识别的灰度直方图

直方图 · 生物识别

实例 6
支付宝月账单报告

饼图 · 移动支付

实例 7
汽车速度与制动距离的关系

散点图 · 交通安全

实例 8
2017/2018 年全国发电量统计

箱形图 · 能源统计

实例 9
霍兰德职业兴趣测试

雷达图 · 职业测评

实例 10
4 个树种不同季节的细根生物量

误差棒图 · 植物研究