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

时间:2016-06-22 16:29:17

标签: 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()

以下是输出。

enter image description here

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

1 个答案:

答案 0 :(得分:5)

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

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

mongodb-driver

enter image description here

<强>更新

没关系,问题不在于您的子图定义,而是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()的调用中使用aspect='auto',以便图片填充轴而不更改它们。如果要使用方形轴,则需要创建具有适当宽高比的图片:

imshow()

enter image description here