Mmatplotlib 可视化实验台 第 2 章
Python Data Visualization · Chapter 02

使用 matplotlib
绘制简单图表

10 个 pyplot 绘图函数、10 个真实案例,一页看懂折线图、柱形图、条形图、堆积面积图、直方图、饼图、散点图、箱形图、雷达图与误差棒图。下方的每一张图表都可交互,鼠标悬停即可查看数据。

plot / bar / barh stackplot / hist / pie scatter / boxplot polar / errorbar
10种基础图表类型
10个教材实例数据
76页课件内容提炼
0依赖纯前端 SVG 绘制
00

章节总览 pyplot

matplotlib 是 Python 最常用的绘图库,其中 matplotlib.pyplot 提供了一套与 MATLAB 风格相近的函数接口。本章围绕 10 个基础绘图函数展开:掌握它们,就能覆盖绝大多数日常数据展示需求。

通用绘图流程

  1. 准备数据用列表或 NumPy 数组组织 x、y 数据,多组数据注意长度一致。
  2. 创建图表调用 plot / bar / pie 等函数,把数据交给它,并用 fmt、labels 等参数描述样式。
  3. 设置图表属性补充标题、坐标轴标签、刻度、图例、中文与负号显示等细节。
  4. 显示图表最后调用 plt.show() 渲染窗口;需要保存则用 plt.savefig()。

最小可用示例

# 1 导入库并解决中文显示
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 2 准备数据
x = [1, 2, 3, 4, 5]
y = [10, 20, 15, 25, 22]

# 3 绘图 + 设置属性
plt.plot(x, y, color='b', marker='o', linestyle='-')
plt.title('示例折线图')
plt.xlabel('x 轴'); plt.ylabel('y 轴')
plt.grid(True, linestyle='--', alpha=0.4)

# 4 显示
plt.show()
01

2.1 绘制折线图 plot()

折线图用线段把相邻的数据点连接起来,适合表现数据随时间或其他连续变量的变化趋势。调用 plot() 时依次传入 x、y 数据即可;fmt 参数用「颜色 + 点型 + 线型」的组合一次性描述样式,例如 'b-o' 表示蓝色实线加圆点。需要在同一坐标系中对比多条曲线时,可以多次调用 plot(),也可以写成 plot(x1, y1, x2, y2)。

实例 1 · 北京市未来 15 天的最高 / 最低气温

单位:℃
最高气温 最低气温 数据来源:表 2-1 · 悬停查看数值
02

2.2 绘制柱形图或堆积柱形图 bar()

柱形图用柱子的高度表示数值大小,适合比较不同类别的数量差异。width 控制柱宽(默认 0.8),tick_label 设置刻度标签;想让第二组数据叠在第一组之上,只要把第一组的高度传给 bottom 参数;xerr / yerr 还能为柱形添加误差棒。函数返回 BarContainer 对象,可以遍历取出每一根柱子。

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

单位:亿元
年度 GMV(柱宽 0.5) 数据来源:表 2-2
03

2.3 绘制条形图或堆积条形图 barh()

当类别名称较长时,横向的条形图比柱形图更易读。barh() 的参数与 bar() 一一对应,只是把「高度」换成了「宽度」:width 表示条形的长度,height 表示条形的粗细,left 则用于绘制堆积条形图。本例把商品种类放在 y 轴刻度标签上,用条形长度表示网购替代率。

实例 3 · 各商品种类的网购替代率(部分)

条形高度 0.6
网购替代率 数据来源:表 2-3
04

2.4 绘制堆积面积图 stackplot()

堆积面积图把多组数据按时间堆叠绘制,既能看出总量的变化,也能看出各部分的构成比例。stackplot() 只需依次传入 x 和多组 y 数据,labels 用于生成图例,baseline 决定堆叠的基准线(默认为 'zero',即从 0 开始堆叠)。

实例 4 · A、B、C 三家物流公司物流费用统计

单位:万元
A 公司 B 公司 C 公司 数据来源:表 2-4
05

2.5 绘制直方图 hist()

直方图用来展示一组数据的分布情况:先把数据分成若干个区间(bins),再统计落入每个区间的数据个数。bins 可以是区间数量,也可以是自定义的区间边界;density=True 时纵轴显示频率密度而非频数。柱子越高,说明数据越集中在该区间。

实例 5 · 人脸识别的灰度直方图(10000 个随机数)

频数分布 切换矩形条数量观察分布形态
06

2.6 绘制饼图或圆环图 pie()

饼图用扇形的面积表示各部分占总体的比例,圆环图则是把圆心挖空后的饼图。labels 设置标签,autopct 控制百分比格式(如 '%3.1f%%'),explode 让某个扇形离开圆心,startangle 指定起始角度,wedgeprops={'width': 0.7} 可以把饼图变成圆环图。

实例 6 · 用户 A 某月使用支付宝的消费明细

总支出 ¥3,000 起始角度 90° · 餐饮美食 explode = 0.1 悬停查看金额
07

2.7 绘制散点图或气泡图 scatter()

散点图用点的位置反映两个变量之间的关系,气泡图则在此基础上用点的大小表示第三个变量。s 控制点的面积,c 控制颜色,marker 控制形状,cmap 可配合数值实现颜色映射。本例中车速越大,制动距离增长得越快,呈现明显的非线性关系。

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

x:km/h y:m
20 组实测数据 悬停查看单点数据
08

2.8 绘制箱形图 boxplot()

箱形图用五个统计量概括一组数据的分布:最小值、下四分位数、中位数、上四分位数和最大值,箱体之外的圆点即异常值。widths 控制箱体宽度,vert=False 让箱体横向摆放,patch_artist=True 为箱体填充颜色,whis 决定异常值的判定范围(默认 1.5 倍四分位距)。

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

单位:亿千瓦时
箱体 = 四分位距(IQR) 横线 = 中位数 圆点 = 异常值
09

2.9 绘制雷达图 polar()

雷达图把多个维度的指标画在同一张极坐标图上,适合对比个体在多个维度上的强弱。使用 polar(theta, r) 时,theta 是各维度对应的角度(弧度),r 是对应的数值;把极坐标轴按维度数量等分,并把首尾数据闭合,就能得到常见的雷达图。点击下方图例可以单独查看某位用户的测试结果。

实例 9 · 霍兰德职业兴趣测试(6 名用户)

得分范围 0 ~ 1
10

2.10 绘制误差棒图 errorbar()

误差棒图在数据点的上下(或左右)画出表示波动范围的线段,用来表达测量的不确定度或数据的离散程度。yerr / xerr 指定误差大小,fmt 控制点线样式,capsize 与 capthick 分别控制误差棒端帽的长度和粗细。

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

单位:g
马尾松 樟树 杉木 桂花 误差棒 = 标准差
11

本章小结 & 图表选型

本章介绍了 matplotlib 中绘制简单图表的 10 个函数,涵盖趋势、对比、构成、分布、关系、多维与不确定性七类表达需求。真正决定图表效果的,往往不是代码,而是「想让读者看到什么」——先确定表达目的,再挑选合适的图形。

看趋势折线图 plot()、堆积面积图 stackplot(),横轴通常是时间。
做对比柱形图 bar() 比高度,条形图 barh() 适合长类别名。
看构成饼图 / 圆环图 pie() 看占比,堆积图看总量与结构。
看分布直方图 hist() 看形态,箱形图 boxplot() 看五数与异常值。
看关系散点图 scatter() 看相关性,气泡图再加一个维度。
看多维雷达图 polar() 在同一坐标系比较多个指标。
看波动误差棒图 errorbar() 表达测量误差与离散程度。
通用提醒中文显示、负号、图例、单位与网格,是图表可读性的基础。