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

标签 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

如您所见,这些图像之间存在不需要的垂直空间。规避这个问题的一种方法是仔细为图形选择合适的尺寸,例如我使用 matplotlib.rcParams['figure.figsize'] = (_, _)在 Jupyter 笔记本中。然而,我通常想要绘制的图像数量在每次绘制它们时会有所不同,每次手动选择正确的图形大小非常不方便(特别是因为我无法准确计算出大小在 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)

enter image description here

更新:

没关系,问题不在于您的子图定义,而在于 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()

enter image description here

关于matplotlib pyplot imshow 图像之间的紧密间距,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37973674/

相关文章:

c++ - 在 cv::imshow() 中出现错误 - 断言:文件 qasciikey.cpp 中的 "false",第 501 行

python - 如何在 plt.imshow() 中设置标记大小

python - 如何在 Python 中设置直方图的 y 轴?

css - Bootstrap4 问题 : proper column structure inside and outside a container

c# - TableLayoutPanel 均匀间隔的单元格

android - 使用 GraphView 库在 Android 中的条形图中的条之间的间距

python - 如何完全去除散点图周围的空白

python - 如何订购数据框在 pandas 中绘制 3d 条

python - 使用matplotlib时对图的控制

python - 给定四边形的角,使用 matplotlib 在 3d 中绘制阴影四边形