matplotlib pyplot显示图像之间的紧密间距

Ray*_*Ray 3 matplotlib spacing imshow

我有一些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()
Run Code Online (Sandbox Code Playgroud)

以下是输出。

在此处输入图片说明

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

Diz*_*ahi 5

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


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

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)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

更新:

没关系,问题不在于子图定义,而是正确设置imshow()会扭曲轴。

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

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()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明