本章介绍使用 matplotlib 的 pyplot 模块绘制 10 种常用基础图表,并结合 10 个数据实例讲解绘图函数的语法与用法。本页面将全部实例数据转化为可交互的网页图表。
matplotlib 是 Python 中应用最广的 2D 绘图库,其 pyplot 子模块提供了类似 MATLAB 的绘图接口, 可以快速将数据绘制成折线图、柱形图、条形图、直方图、饼图、散点图、箱形图、雷达图、误差棒图等常见图表。 每种图表都有最适合的场景:折线图看趋势、柱形/条形图比大小、直方图看分布、 饼图看占比、散点图看相关性、箱形图看统计特征、雷达图看多维评价、误差棒图看数据的波动范围。
折线图用于展示数据随时间或有序变量的变化趋势。使用 pyplot 的 plot() 函数可快速绘制折线图,也可以在同一个坐标系中绘制多条线,通过颜色、线型加以区分。
import numpy as np plt.plot(x, y) # 单条折线 plt.plot(x, y1, x, y2) # 多条折线
实例1:未来15天最高气温和最低气温 —— 根据北京市未来 15 天的天气数据,以日期为 x 轴、最高/最低气温为 y 轴,绘制两条折线对比昼夜温差变化。
柱形图用于比较各类别数据的大小。使用 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,绘制柱形图展示平台成交总额逐年高速增长。
条形图是横向的柱形图,类别名称较长时更适合展示。使用 pyplot 的 barh() 函数可绘制条形图;通过 height 控制条形高度,通过 left 参数传值可绘制堆积条形图,同样支持 xerr / yerr 误差棒。
plt.barh(y, width, height=0.3, color='c') plt.barh(y, y2, left=y1) # 堆积条形图
实例3:各商品种类的网购替代率 —— 网购替代率指网民计划购买的商品中实际在线上购买的比例。以商品种类为 y 轴刻度标签、替代率为 x 轴数据,绘制条形图(部分数据如下)。
堆积面积图将多个数据系列层叠显示,既能观察单个系列的变化,又能反映整体总量。使用 pyplot 的 stackplot() 函数可快速绘制,labels 指定图例、baseline 指定基线。
plt.stackplot(x, y1, y2, y3, labels=('A公司','B公司','C公司'))
实例4:物流公司物流费用统计 —— 将月份作为 x 轴刻度标签,A、B、C 三家物流公司的月度物流费用(万元)作为 y 轴数据,绘制堆积面积图对比全年费用规模。
直方图用于展示数据的分布特征:将数据划分为若干区间,统计落入各区间的频数(或频率)。使用 pyplot 的 hist() 函数可快速绘制,bins 指定区间数量、range 指定范围、density 决定绘制频数还是频率。
plt.hist(x, bins=10, density=True)
实例5:人脸识别的灰度直方图 —— 在人脸识别中,灰度直方图刻画图像灰度值的分布。使用一组 10000 个服从标准正态分布的随机数模拟人脸图像灰度值,绘制直方图。
饼图用扇形面积表示各部分占整体的比例。使用 pyplot 的 pie() 函数可绘制饼图或圆环图:explode 控制扇形离开圆心的距离,autopct 显示百分比,shadow 显示阴影,startangle 设置起始角度,wedgeprops 传宽度可制成圆环图。
plt.pie(x, explode=explode, autopct='%3.1f%%', shadow=True, startangle=90)
实例6:支付宝月账单报告 —— 用户 A 某月使用支付宝消费共 3000 元,将各分类消费金额占总支出的比例绘制成饼图,直观看出"吃喝"占大头。
散点图用点在坐标系中的位置展示两个变量之间的关系,适合观察相关性;当点的大小再映射一个变量时即为气泡图。使用 pyplot 的 scatter() 函数绘制,s 控制点/气泡大小,c 控制颜色。
plt.scatter(x, y, s=area, c=colors)
实例7:汽车速度与制动距离的关系 —— 以车速(km/h)为 x 轴、制动距离(m)为 y 轴,绘制散点图。点的分布近似一条上翘的曲线,说明车速越快,制动距离非线性地急剧增长。
箱形图(箱线图)用"五数"——最小值、下四分位数 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 个月的发电量(亿千瓦·时)分别作为箱形图的数据,比较两年的发电量水平与波动。
雷达图在极坐标系上以多个维度评价对象,每名用户在每个维度上的得分连成一个多边形,适合多维能力/偏好对比。使用 pyplot 的 polar() 函数绘制,theta 为角度、r 为半径。
plt.polar(theta, r) # theta: 角度, r: 数值
实例9:霍兰德职业兴趣测试 —— 6 名用户在研究型、艺术型、社会型、企业型、传统型、现实型 6 个维度的测试得分,绘制雷达图比较不同用户的职业兴趣倾向。
误差棒图在数据点上叠加一段"误差"范围,反映测量值或统计值的波动与不确定度。使用 pyplot 的 errorbar() 函数绘制,yerr / xerr 指定误差,fmt 指定点线格式,capsize / capthick 设置端帽大小与粗细。
plt.errorbar(x, y, yerr=y_offset,
capsize=3, capthick=2)
实例10:4 个树种不同季节的细根生物量 —— 以季节为 x 轴刻度标签,马尾松、樟树、杉木、桂花 4 个树种在春、夏、秋三季的细根生物量(均值 ± 标准差)绘制误差棒图。