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

posted @ 2023-03-16 11:16  咖啡陪你  阅读(679)  评论(0编辑  收藏  举报