【Python系列课程】Matplotlib(四):子图布局与图像保存——subplot、axes、savefig
阅读时长12分钟 | 关键词Matplotlib、subplot子图、axes画图中图、savefig保存、动态图引言一篇论文或报告中常常需要把多张图放在一起对比。Matplotlib 提供了subplot()排布子图和axes()画图中图两种方式最后用savefig()保存为图片文件。这是 Matplotlib 系列的收官篇。一、plt.subplot() 创建子图在一个画布上按行 × 列的网格排布多个子图plt.subplot(2, 2, 1) 2行 × 2列第1个位置 plt.subplot(2, 2, 2) 2行 × 2列第2个位置 plt.subplot(2, 2, 3) 2行 × 2列第3个位置 plt.subplot(2, 2, 4) 2行 × 2列第4个位置 ┌─────────┬─────────┐ │ (1) │ (2) │ ├─────────┼─────────┤ │ (3) │ (4) │ └─────────┴─────────┘importmatplotlib.pyplotaspltimportnumpyasnp plt.rcParams[font.sans-serif][SimHei]plt.rcParams[axes.unicode_minus]Falsexnp.linspace(-3,3,50)y12*x1y2x**2y3np.sin(x)y4np.tan(x)plt.figure(figsize(10,8))# 2行2列第1个plt.subplot(2,2,1)plt.plot(x,y1)plt.title(直线)# 2行2列第2个plt.subplot(2,2,2)plt.plot(x,y2,colorred)plt.title(抛物线)# 2行2列第3个plt.subplot(2,2,3)plt.plot(x,y3,colorgreen)plt.title(正弦曲线)# 2行2列第4个plt.subplot(2,2,4)plt.plot(x,y4,colororange)plt.title(正切曲线)plt.tight_layout()# 自动调整子图间距plt.show()参数plt.subplot(nrows, ncols, index)参数说明nrows行数ncols列数index第几个子图从 1 开始按行从左到右编号不规则布局子图不必占满规则网格——可以在部分位置画图plt.figure(figsize(10,6))# 2行1列第1个占上半部分整行plt.subplot(2,1,1)plt.plot(x,y1,colorblue)plt.title(直线)# 2行3列第4个下半部分左侧plt.subplot(2,3,4)plt.plot(x,y2,colorred)plt.title(抛物线)# 2行3列第5个下半部分中间plt.subplot(2,3,5)plt.plot(x,y3,colorgreen)plt.title(正弦曲线)# 2行3列第6个下半部分右侧plt.subplot(2,3,6)plt.plot(x,y4,colororange)plt.title(正切曲线)plt.tight_layout()plt.show()┌────────────────────────────┐ │ (1) 上半部 │ │ 2行1列 第1个 │ ├─────────┬────────┬─────────┤ │ (4) │ (5) │ (6) │ │ 2行3列 │ 2行3列 │ 2行3列 │ │ 第4个 │ 第5个 │ 第6个 │ └─────────┴────────┴─────────┘ 技巧上半用subplot(2,1,1)下半用subplot(2,3,4)—subplot(2,3,6)Matplotlib 自动对齐。二、plt.axes() 画图中图axes()不强求网格布局而是在画布的任意位置上独立放置一个坐标系xnp.linspace(-3,3,50)y12*x1y2x**2y3np.sin(x)plt.figure(figsize(8,6))# 主图占画布 80%左下角在 (10%, 10%) 位置plt.axes([0.1,0.1,0.8,0.8])plt.title(直线)plt.plot(x,y1)# 小图1占画布 25%放在右上角 (20%, 60%) 位置plt.axes([0.2,0.6,0.25,0.25])plt.title(抛物线)plt.plot(x,y2,colorred)# 小图2占画布 25%放在右下角 (60%, 20%) 位置plt.axes([0.6,0.2,0.25,0.25])plt.plot(x,y3,colorgreen)plt.title(余弦曲线)plt.show()[0.1, 0.1, 0.8, 0.8] 这四个数字的含义 0.1, 0.1 → 坐标框左下角在画布 10%, 10% 的位置 0.8, 0.8 → 坐标框的宽和高都是画布的 80%axes()适合主图 局部放大、主图 辅助子图这类非规则布局。三、plt.savefig() 保存图像plt.figure()xnp.linspace(-3,3,50)plt.plot(x,np.sin(x),colorblue)plt.title(正弦曲线)# 保存到文件plt.savefig(./sine_wave.jpg)plt.savefig(./sine_wave.png,dpi300)# 高分辨率 PNGplt.savefig(./sine_wave.svg)# 矢量图放大不失真参数说明fname文件路径后缀决定格式.jpg/.png/.svg/.pdfdpi分辨率默认 100设 300 适合印刷bbox_inchestight自动裁剪白边facecolor背景颜色四、bonus动态图plt.pause数据变化时可以用plt.pause()和plt.clf()做简单的动画效果y2[]y1np.linspace(-3,3,50)foriiny1**2:y2.append(i)plt.clf()# 清除上一次的数据plt.plot(y2)plt.pause(0.1)# 暂停 0.1 秒# 你会看到曲线一段一段生长出来plt.savefig(./parabola.jpg)plt.clf() clear figure清除当前画布plt.pause(seconds) 暂停指定的秒数小结函数用途用法plt.subplot(r, c, i)规则网格布局2×2 四宫格、1×3 横向排列plt.axes([l, b, w, h])任意位置放坐标系主图局部放大、画图中图plt.savefig(path)保存为图片文件png/jpg/svg/pdf 多种格式plt.clf() plt.pause()动态更新简单动画效果 Matplotlib 系列完结篇目内容一plt.plot() 基础绘图、figure 画布、中文显示二坐标轴设置、spines 边框、legend 图例、text 标注三scatter 散点图、bar 条形图、imshow 热力图四subplot 子图、axes 画图中图、savefig 保存掌握了这 4 篇日常数据可视化基本够了。之后遇到更高级的需求3D 图、交互式图表Seaborn 和 Plotly 会是好帮手。本文是「Python从入门到数据分析」系列的第 22 篇也是 Matplotlib 系列的终篇。 全系列 22 篇文章从 Python 基础变量到数据分析可视化完整覆盖了入门到数据分析的全路径。全系列导航Python 基础 → 函数/模块/面向对象 → NumPy → Pandas → Matplotlib