Matplotlib调整图像子图hspace和wspace

时间:2018-10-05 08:57:52

标签: python matplotlib subplot imshow

我正在尝试构建一个在3×3网格上具有9个图像子图的图形,它们全部共享X轴或Y轴,并且相邻子图之间没有空间。

以下代码添加所需的轴并折叠它们之间的空间。到目前为止,一切都很好:

fig, axes = plt.subplots(ncols=3, nrows=3, sharex=True, sharey=True)
fig.subplots_adjust(hspace=0, wspace=0)

3×3 grid of empty axes with no space between adjacent axes

但是,在这些图中绘制图像会破坏所有内容,因为imshow会更改子图的长宽比:

img = np.arange(100).reshape(10, 10)
for ax in axes.flat:
    ax.imshow(img)

3×3 grid of subplots containing square images, with a space visible between adjacent image columns

(如果图像太宽,则会在行之间而不是列as shown on this figure处留有空格。)

问题:如何制作一个包含图像子图的图形,而不考虑图像的长宽比?

不能成为答案的

2 个答案:

答案 0 :(得分:1)

您可以指定图形尺寸,以使其具有不同的宽高比;在这种情况下为正方形:

import numpy as np
from matplotlib import pyplot as plt    

fig, axes = plt.subplots(ncols=3, nrows=3, sharex=True, sharey=True, figsize=(5,5))
fig.subplots_adjust(hspace=0, wspace=0)

img = np.arange(100).reshape(10, 10)
for ax in axes.flat:
    ax.imshow(img)
plt.show()

这不是最灵活的解决方案,但它是一个非常简单的解决方案。

enter image description here

答案 1 :(得分:0)

2×2网格的部分答案

可以使用ax.set_anchor在分配的空间内对齐每个图像:

fig, axes = plt.subplots(ncols=2, nrows=2, sharex=True, sharey=True)
fig.subplots_adjust(hspace=0, wspace=0)
axes[0, 0].set_anchor('SE')
axes[1, 0].set_anchor('NE')
axes[0, 1].set_anchor('SW')
axes[1, 1].set_anchor('NW')
img = np.arange(100).reshape(10, 10)
for ax in axes.flat:
    ax.imshow(img)

2×2 image subplots grid with no space between the images

这也适用于wider aspect ratio,但对于宽于或高于2轴的网格会失效。