PYTHON 数据可视化 · 课件讲义

第2章 使用 matplotlib 绘制简单图表

本章介绍使用 matplotlib 的 pyplot 模块绘制 10 种常用基础图表,并结合 10 个数据实例讲解绘图函数的语法与用法。本页面将全部实例数据转化为可交互的网页图表。

plot() 折线图bar() 柱形图barh() 条形图 stackplot() 堆积面积图hist() 直方图pie() 饼图 scatter() 散点/气泡图boxplot() 箱形图polar() 雷达图errorbar() 误差棒图

章节概述

matplotlib 是 Python 中应用最广的 2D 绘图库,其 pyplot 子模块提供了类似 MATLAB 的绘图接口, 可以快速将数据绘制成折线图、柱形图、条形图、直方图、饼图、散点图、箱形图、雷达图、误差棒图等常见图表。 每种图表都有最适合的场景:折线图看趋势、柱形/条形图比大小、直方图看分布、 饼图看占比、散点图看相关性、箱形图看统计特征、雷达图看多维评价、误差棒图看数据的波动范围。

2.1

绘制折线图

plot()

折线图用于展示数据随时间或有序变量的变化趋势。使用 pyplot 的 plot() 函数可快速绘制折线图,也可以在同一个坐标系中绘制多条线,通过颜色、线型加以区分。

import numpy as np
plt.plot(x, y)                       # 单条折线
plt.plot(x, y1, x, y2)               # 多条折线

实例1:未来15天最高气温和最低气温 —— 根据北京市未来 15 天的天气数据,以日期为 x 轴、最高/最低气温为 y 轴,绘制两条折线对比昼夜温差变化。

从图中可以看出:气温整体呈先降后回升的趋势,9月15—16日达到最低点(21℃ / 14℃)。
2.2

绘制柱形图或堆积柱形图

bar()

柱形图用于比较各类别数据的大小。使用 pyplot 的 bar() 函数可绘制柱形图;通过 width 控制柱宽、color/edgecolor 控制填充与边框颜色,通过给 bottom 参数传值可实现堆积柱形图,给 xerr / yerr 传值可为柱形添加误差棒。

plt.bar(x, height, width=0.5, color='m', edgecolor='k')
plt.bar(x, y2, bottom=y1)            # 堆积柱形图

实例2:2013~2019 财年阿里巴巴淘宝和天猫平台的 GMV —— 以财年为 x 轴、GMV(亿元)为 y 轴,柱宽取 0.5,绘制柱形图展示平台成交总额逐年高速增长。

FY2013 的 GMV 约为 10770 亿元,到 FY2019 已增长至 57270 亿元,六年间增长约 4.3 倍。
2.3

绘制条形图或堆积条形图

barh()

条形图是横向的柱形图,类别名称较长时更适合展示。使用 pyplot 的 barh() 函数可绘制条形图;通过 height 控制条形高度,通过 left 参数传值可绘制堆积条形图,同样支持 xerr / yerr 误差棒。

plt.barh(y, width, height=0.3, color='c')
plt.barh(y, y2, left=y1)             # 堆积条形图

实例3:各商品种类的网购替代率 —— 网购替代率指网民计划购买的商品中实际在线上购买的比例。以商品种类为 y 轴刻度标签、替代率为 x 轴数据,绘制条形图(部分数据如下)。

生活服务类(家政、家教、保姆等)替代率最高,达 95.9%;书报杂志及音像制品相对最低,为 86.0%。
2.4

绘制堆积面积图

stackplot()

堆积面积图将多个数据系列层叠显示,既能观察单个系列的变化,又能反映整体总量。使用 pyplot 的 stackplot() 函数可快速绘制,labels 指定图例、baseline 指定基线。

plt.stackplot(x, y1, y2, y3, labels=('A公司','B公司','C公司'))

实例4:物流公司物流费用统计 —— 将月份作为 x 轴刻度标签,A、B、C 三家物流公司的月度物流费用(万元)作为 y 轴数据,绘制堆积面积图对比全年费用规模。

B 公司下半年费用增长明显,12 月三家费用合计达到 946 万元,为全年最高。
2.5

绘制直方图

hist()

直方图用于展示数据的分布特征:将数据划分为若干区间,统计落入各区间的频数(或频率)。使用 pyplot 的 hist() 函数可快速绘制,bins 指定区间数量、range 指定范围、density 决定绘制频数还是频率。

plt.hist(x, bins=10, density=True)

实例5:人脸识别的灰度直方图 —— 在人脸识别中,灰度直方图刻画图像灰度值的分布。使用一组 10000 个服从标准正态分布的随机数模拟人脸图像灰度值,绘制直方图。

灰度值集中在 0 附近,呈典型的"钟形"正态分布,两侧逐渐递减。
2.6

绘制饼图或圆环图

pie()

饼图用扇形面积表示各部分占整体的比例。使用 pyplot 的 pie() 函数可绘制饼图或圆环图:explode 控制扇形离开圆心的距离,autopct 显示百分比,shadow 显示阴影,startangle 设置起始角度,wedgeprops 传宽度可制成圆环图。

plt.pie(x, explode=explode, autopct='%3.1f%%',
        shadow=True, startangle=90)

实例6:支付宝月账单报告 —— 用户 A 某月使用支付宝消费共 3000 元,将各分类消费金额占总支出的比例绘制成饼图,直观看出"吃喝"占大头。

餐饮美食 1000 元占 33.3%,是当月最大支出;购物 800 元(26.7%)次之。
2.7

绘制散点图或气泡图

scatter()

散点图用点在坐标系中的位置展示两个变量之间的关系,适合观察相关性;当点的大小再映射一个变量时即为气泡图。使用 pyplot 的 scatter() 函数绘制,s 控制点/气泡大小,c 控制颜色。

plt.scatter(x, y, s=area, c=colors)

实例7:汽车速度与制动距离的关系 —— 以车速(km/h)为 x 轴、制动距离(m)为 y 轴,绘制散点图。点的分布近似一条上翘的曲线,说明车速越快,制动距离非线性地急剧增长。

车速从 100 km/h 提高到 200 km/h,制动距离由 49.2 m 增至 196.8 m,安全距离必须留足。
2.8

绘制箱形图

boxplot()

箱形图(箱线图)用"五数"——最小值、下四分位数 Q1、中位数、上四分位数 Q3、最大值来展示数据的统计分布与离群值。使用 pyplot 的 boxplot() 函数绘制,notch 凹槽显示、sym 异常点样式、whis 须长、patch_artist 允许填充颜色。

plt.boxplot(data, meanline=True, widths=0.3,
            patch_artist=True, showfliers=False)

实例8:2017 年和 2018 年全国发电量统计 —— 将 2017、2018 两年各 12 个月的发电量(亿千瓦·时)分别作为箱形图的数据,比较两年的发电量水平与波动。

2018 年箱体整体高于 2017 年(中位数约 5413 对 5194 亿千瓦·时),且两月度峰值均出现在 7—8 月用电高峰。
2.9

绘制雷达图

polar()

雷达图在极坐标系上以多个维度评价对象,每名用户在每个维度上的得分连成一个多边形,适合多维能力/偏好对比。使用 pyplot 的 polar() 函数绘制,theta 为角度、r 为半径。

plt.polar(theta, r)                  # theta: 角度, r: 数值

实例9:霍兰德职业兴趣测试 —— 6 名用户在研究型、艺术型、社会型、企业型、传统型、现实型 6 个维度的测试得分,绘制雷达图比较不同用户的职业兴趣倾向。

用户1 现实型得分突出(0.88),用户2 偏研究型,用户3 偏艺术型,用户4、5 分别倾向企业型与社会型。
2.10

绘制误差棒图

errorbar()

误差棒图在数据点上叠加一段"误差"范围,反映测量值或统计值的波动与不确定度。使用 pyplot 的 errorbar() 函数绘制,yerr / xerr 指定误差,fmt 指定点线格式,capsize / capthick 设置端帽大小与粗细。

plt.errorbar(x, y, yerr=y_offset,
             capsize=3, capthick=2)

实例10:4 个树种不同季节的细根生物量 —— 以季节为 x 轴刻度标签,马尾松、樟树、杉木、桂花 4 个树种在春、夏、秋三季的细根生物量(均值 ± 标准差)绘制误差棒图。

杉木细根生物量显著高于其他树种(约 4.6~5.0 g);桂花秋季回升至 4.10 g,樟树各季稳定在 1.6 g 左右。
2.11

本章小结

  • 趋势类:plot() 折线图、stackplot() 堆积面积图 —— 观察数据随时间的变化。
  • 比较类:bar() 柱形图、barh() 条形图 —— 比较类别数据大小,支持堆积与误差棒。
  • 分布类:hist() 直方图、boxplot() 箱形图 —— 展示数据的分布与统计特征。
  • 占比类:pie() 饼图/圆环图 —— 展示各部分占总体的比例。
  • 关系与多维类:scatter() 散点/气泡图、polar() 雷达图、errorbar() 误差棒图。
  • 绘图流程可归纳为:准备数据 → 调用 pyplot 绘图函数 → 设置标题/坐标轴/图例 → 调用 plt.show() 展示图表。