python绘图subplot绘制5幅图:以2行绘制,首行3幅图,次行2幅图居中(内含绘制3幅图简单版)
省时版本解决方法
请使用matplotlib.gridspec
import matplotlib import matplotlib.pyplot as plt import matplotlib.gridspec as gridspec
import matplotlib.gridspec as gridspec import matplotlib.pyplot as plt gs = gridspec.GridSpec(2, 6) # 创立2 * 6 网格 gs.update(wspace=0.8) # 对第一行进行绘制 ax1 = plt.subplot(gs[0, :2]) # gs(哪一行,绘制网格列的范围) ax2 = plt.subplot(gs[0, 2:4]) ax3 = plt.subplot(gs[0, 4:6]) # 对第二行进行绘制 ax4 = plt.subplot(gs[1, 1:3]) ax5 = plt.subplot(gs[1, 3:5]) plt.show()
绘制5幅图,以2行绘制,首行3幅图,次行2幅图居中:
遇到的问题
在研读《数字图像处理与python实现》一书,做实验时需要绘制如下图所示的5幅图,自己的印象中subplot绘图只能上下对齐,所以下图的绘制遇到问题。
解决方法
根据参考1,习得了绘制3幅图,以2行绘制,单幅图像居中的方法。
import matplotlib.pyplot as plt import matplotlib.gridspec as gridspec gs = gridspec.GridSpec(2, 4) gs.update(wspace=0.5) ax1 = plt.subplot(gs[0, :2], ) ax2 = plt.subplot(gs[0, 2:]) ax3 = plt.subplot(gs[1, 1:3]) plt.show()
引用:您可以使用gridspec.Gridspec()。这里的技巧是创建一个规则的网格,但不是在每个单元格中都有一个绘图。例如,在本例中,我创建了一个2x4单元格网格。每个绘图跨越2个单元格。所以在第一行,我有两个图(2x2个单元格)在第二行,我有一个空单元格,一个绘图(1x2个单元格)和另一个空单元格。源:见参考1
绘制3幅图,以2行绘制,单幅图像居中实验结果:
然后去官方文档(详见参考2)巡视了一圈,然后尝试变成绘制5幅图,以2行绘制,首行3幅图,次行2幅图居中
import matplotlib.gridspec as gridspec import matplotlib.pyplot as plt gs = gridspec.GridSpec(2, 6) gs.update(wspace=0.8) ax1 = plt.subplot(gs[0, :2]) ax2 = plt.subplot(gs[0, 2:4]) ax3 = plt.subplot(gs[0, 4:6]) ax4 = plt.subplot(gs[1, 1:3]) ax5 = plt.subplot(gs[1, 3:5]) plt.show()
绘制5幅图,以2行绘制,首行3幅图,次行2幅图居中实验结果:
绘制结果
实验代码
from scipy import ndimage from skimage import data, util from matplotlib import pyplot as plt import matplotlib.gridspec as gridspec img = data.astronaut()[:, :, 0] # 对图像加入胡椒噪声 pepper_img = util.random_noise(img, mode='pepper', seed=None, clip=True) # 对图像加入盐粒噪声 salt_img = util.random_noise(img, mode='salt', seed=None, clip=True) n = 3 # 最大值滤波 max_img = ndimage.maximum_filter(pepper_img, (n, n)) # 最小值滤波 min_img = ndimage.minimum_filter(salt_img, (n, n)) # 显示图像 plt.rcParams['font.sans-serif'] = ['SimHei'] # 中文 gs = gridspec.GridSpec(2, 6) gs.update(wspace=0.8) ax1 = plt.subplot(gs[0, :2]) ax1.imshow(img,cmap='gray') ax1.set_title("宇航员原图") ax2 = plt.subplot(gs[0, 2:4]) ax2.imshow(pepper_img,cmap='gray') ax2.set_title("加胡椒噪声图像") ax3 = plt.subplot(gs[0, 4:6]) ax3.imshow(salt_img,cmap='gray') ax3.set_title("加盐粒噪声图像") ax4 = plt.subplot(gs[1, 1:3]) ax4.imshow(max_img,cmap='gray') ax4.set_title("最大值滤波结果") ax5 = plt.subplot(gs[1, 3:5]) ax5.imshow(min_img,cmap='gray') ax5.set_title("最小值滤波结果") plt.show()
参考
[1]python - Matplotlib:3幅图以2行绘制,单幅图像居中
[2]官方文档:Customizing Figure Layouts Using GridSpec and Other Functions