matplotlib pyplot imshow 图像之间的紧密间距
matplotlib pyplot imshow tight spacing between images
我有一些 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()
下面是输出。
如您所见,这些图像之间存在不需要的垂直 space。避免这个问题的一种方法是仔细地为图形选择合适的大小,例如我在 Jupyter Notebook 中使用 matplotlib.rcParams['figure.figsize'] = (_, _)
。但是,我每次绘制图像时通常要绘制的图像数量各不相同,而且每次都手动选择正确的图形大小非常不方便(特别是因为我无法准确计算出大小在 Matplotlib 中的含义)。那么,考虑到我的所有(64 x 64)图像都需要彼此齐平的要求,有没有一种方法可以让 Matplotlib 自动计算出图形的大小? (或者,就此而言,彼此相邻指定的距离?)
注意:正确答案在原始答案下方的更新中报告。
先创建你的子图,然后在其中绘制。
为了简单起见,我在这里用一行完成
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'
,这样图片就可以填满坐标轴而不改变它们。如果你想要方轴,你需要创建一个具有适当width/height比例的图片:
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()
我有一些 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()
下面是输出。
如您所见,这些图像之间存在不需要的垂直 space。避免这个问题的一种方法是仔细地为图形选择合适的大小,例如我在 Jupyter Notebook 中使用 matplotlib.rcParams['figure.figsize'] = (_, _)
。但是,我每次绘制图像时通常要绘制的图像数量各不相同,而且每次都手动选择正确的图形大小非常不方便(特别是因为我无法准确计算出大小在 Matplotlib 中的含义)。那么,考虑到我的所有(64 x 64)图像都需要彼此齐平的要求,有没有一种方法可以让 Matplotlib 自动计算出图形的大小? (或者,就此而言,彼此相邻指定的距离?)
注意:正确答案在原始答案下方的更新中报告。
先创建你的子图,然后在其中绘制。 为了简单起见,我在这里用一行完成
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'
,这样图片就可以填满坐标轴而不改变它们。如果你想要方轴,你需要创建一个具有适当width/height比例的图片:
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()