2016-06-22 80 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我已經修改了上面的答案 –