当前位置:   article > 正文

python绘图subplot绘制5幅图:以2行绘制,首行3幅图,次行2幅图居中(内含绘制3幅图简单版)_python 5个子图

python 5个子图

省时版本解决方法

请使用matplotlib.gridspec

import matplotlib
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
  • 1
  • 2
  • 3
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()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

绘制5幅图,以2行绘制,首行3幅图,次行2幅图居中:
在这里插入图片描述

遇到的问题

在研读《数字图像处理与python实现》一书,做实验时需要绘制如下图所示的5幅图,自己的印象中subplot绘图只能上下对齐,所以下图的绘制遇到问题。
在这里插入图片描述
来源:岳亚伟《数字图像处理与python实现》

解决方法

根据参考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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

引用:您可以使用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()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

绘制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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

参考

[1]python - Matplotlib:3幅图以2行绘制,单幅图像居中
[2]官方文档:Customizing Figure Layouts Using GridSpec and Other Functions

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/896979
推荐阅读
相关标签
  

闽ICP备14008679号