2016-06-22 36 views
2

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

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)图像需要彼此相邻排列? (或者就此而言,彼此相邻的指定距离?)

回答

3

先创建您的子图,然后绘制它们。 我做这件事是一个线在这里为简单起见

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) 

enter image description here

UPDATE: 没关系,这个问题是不是与你的次要情节的定义,但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() 

enter image description here

+0

你能证明此工作时的4个图像是在2×2的网格,而不是单行?我的方法也适用于单行,但不适用于2 x 2网格。 – Ray

+0

@Ray我已经修改了上面的答案 –