如何在matplotlib中不改变对齐的情况下将任意图像拟合到子图中?

yb3bgrhw  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(113)

我有个准则

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

def format_axes(fig):
    for i, ax in enumerate(fig.axes):
        ax.text(0.5, 0.5, "ax%d" % (i+1), va="center", ha="center")
        ax.tick_params(labelbottom=False, labelleft=False)

# gridspec inside gridspec
fig = plt.figure()

gs0 = gridspec.GridSpec(2, 2, figure=fig)

gs00 = gs0[0,0].subgridspec(2, 3, wspace=0)

ax1 = fig.add_subplot(gs00[:, :-1])
ax2 = fig.add_subplot(gs00[0, -1])

gs01 = gs0[0,1].subgridspec(2, 3, wspace=0)

ax3 = fig.add_subplot(gs01[:, :-1])
ax4 = fig.add_subplot(gs01[0, -1])

gs10 = gs0[1,0].subgridspec(1, 1)

ax5 = fig.add_subplot(gs10[0, 0])

gs11 = gs0[1,1].subgridspec(1, 1)

ax6 = fig.add_subplot(gs11[0, 0])

format_axes(fig)

for ax in fig.axes:
    ax.get_xaxis().set_visible(False)
    ax.get_yaxis().set_visible(False)

plt.tight_layout()
plt.show()

得到draft of the figure
我需要用任意形状的图像填充这些子图,就像这样

img1 = np.random.rand(10, 20)
img2 = np.random.rand(15, 25)
img3 = np.random.rand(20, 30)
img4 = np.random.rand(25, 35)
img5 = np.random.rand(30, 40)
img6 = np.random.rand(35, 45)

ax1.imshow(img1)
ax2.imshow(img2)
ax3.imshow(img3)
ax4.imshow(img4)
ax5.imshow(img5)
ax6.imshow(img6)

但是它改变了子图的位置和它们的宽高比(here)。我还需要保持图像的宽高比。
我如何绘制它并保持对齐和纵横比?
我试图手动扩展我的图像,使它们具有与草图中的子图相同的长宽比。在我看来,它可以解决对齐问题。但我没有成功地提取这些长宽比。

fhity93d

fhity93d1#

IIUC需要在调用中指定aspect参数,可以使用axis.set_aspect,也可以在ax.imshow中显式设置aspect

ax1.imshow(img1, aspect='auto')
ax2.imshow(img2, aspect='auto')
ax3.imshow(img3, aspect='auto')
ax4.imshow(img4, aspect='auto')
ax5.imshow(img5, aspect='auto')
ax6.imshow(img6, aspect='auto')
plt.show()

输出:

相关问题