我们通常会碰到如下难题,程序运行生成了多张图片,但一个个显示会比较鸡肋,因为后面需要一个个关闭图形窗口。为方便阅览,就可以用上Matplotlib来绘制多张子图。那么,我们应该如何实现这种功能呢?Python的Matplotlib库功能十分强大。例如,可以通过Matplotlib当中的pyplot模块实现添加子图。 一般来说,在python中实现多子图绘制的函数主要有两个:
fig.add_subplot(行、列、位置)
plt.subplots(行,列)
需要指定子图的具体位置
代码如下(示例):
import cv2 as cv
import matplotlib.pyplot as plt
image = cv.imread('./demo/image database1/src_test_images/11.png')
I1 = cv.flip(image, 1) # 水平翻转或者说是沿着y轴翻转
I2 = cv.flip(image, 0) # 垂直翻转或者说是沿着x轴翻转
I3 = cv.flip(image, -1) # 垂直水平翻转或者说是沿着xy轴翻转
fig = plt.figure(figsize=(10, 8)) # 创建新的figure
# 绘制2x2两行两列共四个图,编号从1开始
sub1 = fig.add_subplot(221) # 通过add_subplot()创建一个或多个绘图
plt.imshow(image) # imshow()函数实现绘图
plt.title('原图(image)')
sub2 = fig.add_subplot(222)
plt.imshow(I1)
plt.title('水平(I1)')
sub3 = fig.add_subplot(223)
plt.imshow(I2)
plt.title('垂直(I2)')
sub4 = fig.add_subplot(224)
plt.imshow(I3)
plt.title('垂直水平翻转(I3)')
plt.rcParams['font.sans-serif'] = ['SimHei'] # 手动选择字体,显示中文标签。SimHei 中文黑体 Kaiti 中文楷体 FangSong 中文仿宋
plt.rcParams['font.size'] = 15 #设置字体大小
fig.suptitle("多子图绘制")
plt.show() # 图片的显示
注意flip()函数:flip函数是矩阵或者图像翻转,其实图像的本质也是矩阵。
void flip(InputArray src, OutputArray dst, int flipCode)
参数声明:
src:输入矩阵
dst:翻转后矩阵,类型与src一致
flipCode:翻转模式,flipCode==0垂直翻转(沿X轴翻转)、 flipCode>0水平翻转(沿Y轴翻转),flipCode<0水平垂直翻转(先沿X轴翻转,再沿Y轴翻转,等价于旋转180°)
pyplot.subplot()其实是pyplot.add_subplot()的一个封装。
函数的定义签名为:matplotlib.pyplot.subplot(*args,**kwargs)
函数的调用签名:subplot(nrows,ncols,index,**kwargs)
函数的参数:
*args:定义子图的位置。*args是由三个整数的三元组(nrows,ncols,index)。首先构成nrows行和ncols列的网格,然后子图添加到对应index索引位置。index从1开始累积,1为左上角,依次向右递增。
subplot的使用分为规则布局和不规则布局。
代码如下(示例):
import cv2 as cv
import matplotlib.pyplot as plt
image = cv.imread('./demo/image database1/src_test_images/11.png')
I1 = cv.flip(image, 1) # 水平翻转或者说是沿着y轴翻转
I2 = cv.flip(image, 0) # 垂直翻转或者说是沿着x轴翻转
I3 = cv.flip(image, -1) # 垂直水平翻转或者说是沿着xy轴翻转
plt.subplot(221)
plt.imshow(image)
plt.subplot(222)
plt.imshow(I1)
plt.subplot(223)
plt.imshow(I2)
plt.subplot(224)
plt.imshow(I3)
# 子图I3这里设置x、y轴刻度标签,范围,间距,旋转,字号
plt.xlabel('set_xlabel')
plt.ylabel('set_ylabel', fontsize=12, color='b') # 设置y轴刻度标签
plt.xlim(0,250) # 设置x轴刻度范围
plt.xticks(range(0,250,50)) # 设置x轴刻度间距
plt.tick_params(axis='x', labelsize=10, rotation=30) # x轴标签旋转、字号等
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['font.size'] = 15
plt.suptitle("多子图绘制")
plt.show()
通常子区函数subplot()用来完成等分画布的绘图展示,如果需要非等分画布的图形展示时,可以多次调用subplot()来完成。
代码如下(示例):
import matplotlib.pyplot as plt
# 绘制1行2列子图中的第1个子图
plt.subplot(121, facecolor = 'b')
# 绘制2行2列子图中的第2个子图
plt.subplot(222, facecolor = 'g')
# 绘制2行2列子图中的第4个子图
plt.subplot(224, facecolor = 'r')
plt.show()
subplot()函数的一个重要特性:
在创建新的子图时,如果新建子图与原有的子图存在重叠的情况,那么会删除原有的重叠的子图哦~