matplotlib pyplot imshow 图像之间的紧密间距

Posted

技术标签:

【中文标题】matplotlib pyplot imshow 图像之间的紧密间距【英文标题】:matplotlib pyplot imshow tight spacing between images 【发布时间】:2016-10-24 17:29:05 【问题描述】:

我有一些形状相同的 numpy 图像数组(例如 (64, 64, 3))。我想使用pyplot.subplot() 将它们绘制在网格中,但是当我这样做时,即使我使用pyplot.subplots_adjust(hspace=0, wspace=0),图像之间也会出现不需要的间距。下面是一段示例代码。

from matplotlib import pyplot
import numpy

def create_dummy_images():
    """
    Creates images, each of shape (64, 64, 3) and of dtype 8-bit unsigned integer.

    :return: 4 images in a list.
    """
    saturated_channel = numpy.ones((64, 64), dtype=numpy.uint8) * 255
    zero_channel = numpy.zeros((64, 64), dtype=numpy.uint8)
    red = numpy.array([saturated_channel, zero_channel, zero_channel]).transpose(1, 2, 0)
    green = numpy.array([zero_channel, saturated_channel, zero_channel]).transpose(1, 2, 0)
    blue = numpy.array([zero_channel, zero_channel, saturated_channel]).transpose(1, 2, 0)
    random = numpy.random.randint(0, 256, (64, 64, 3))
    return [red, green, blue, random]


if __name__ == "__main__":
    images = create_dummy_images()
    for i, image in enumerate(images):
        pyplot.subplot(2, 2, i + 1)
        pyplot.axis("off")
        pyplot.imshow(image)
    pyplot.subplots_adjust(hspace=0, wspace=0)
    pyplot.show()

下面是输出。

如您所见,这些图像之间存在不需要的垂直空间。规避此问题的一种方法是为图形仔细挑选合适的尺寸,例如我在 Jupyter Notebook 中使用matplotlib.rcParams['figure.figsize'] = (_, _)。但是,我通常想要绘制的图像数量在每次绘制它们时都会有所不同,并且每次手动选择正确的图形尺寸非常不方便(特别是因为我无法准确计算出 Matplotlib 中尺寸的含义)。那么,考虑到我的所有(64 x 64)图像需要彼此对齐的要求,Matplotlib 是否可以自动计算出图形的大小? (或者,就此而言,彼此相邻的指定距离?)

【问题讨论】:

【参考方案1】:

注意:正确答案在原始答案下方的更新中报告。


首先创建子图,然后在其中绘制。 为了简单起见,我在这里做了一行

images = create_dummy_images()
fig, axs = pyplot.subplots(nrows=1, ncols=4, gridspec_kw='wspace':0, 'hspace':0,
                           squeeze=True)
for i, image in enumerate(images):
    axs[i].axis("off")
    axs[i].imshow(image)

更新:

没关系,问题不在于您的子图定义,而在于 imshow() 在您正确设置它们之后扭曲了您的坐标轴。

解决方案是在对imshow() 的调用中使用aspect='auto',以便图片填充轴而不更改它们。如果你想有方轴,你需要创建一个具有适当宽高比的图片:

pyplot.figure(figsize=(5,5))
images = create_dummy_images()

for i, image in enumerate(images):
    pyplot.subplot(2, 2, i + 1)
    pyplot.axis("off")
    pyplot.imshow(image, aspect='auto')

pyplot.subplots_adjust(hspace=0, wspace=0)
pyplot.show()

【讨论】:

你能证明这在 4 个图像在 2 x 2 网格中而不是在单行中时有效吗?我的方法也适用于单行,但不适用于 2 x 2 网格。 @Ray 我已经修改了上面的答案 在我的情况下,使用 plt.subplot(2,2,i+1) 子图和 plt.figure(figsize=(20,20))plt.subplots_adjust(hspace=0.05, wspace=0.05) 就足够了,如果使用轴,效果最好。

以上是关于matplotlib pyplot imshow 图像之间的紧密间距的主要内容,如果未能解决你的问题,请参考以下文章

matplotlib pyplot imshow 图像之间的紧密间距

PythonPyCharm中matplotlib.pyplot.imshow()无法绘图

matplotlib imshow

matplotlib imshow扭曲颜色[重复]

OpenCV 函数学习04-用 matplotlib 显示图像(plt.imshow)

使用 OpenCV 或 Matplotlib/Pyplot 可视化 MNIST 数据集