子图中的imshow与plot共享同一尺寸

1 投票
1 回答
3101 浏览
提问于 2025-04-18 11:05

我有两个子图,一个是用 ax1.imshow 创建的,另一个是用 ax2.plot 创建的。我希望 imshow 保持它原来的宽高比,同时希望 plot 的高度和 imshow 一样。此外,我还希望这两个子图之间没有间隙,也就是说,它们的黑色边框应该紧挨着,甚至可以重叠。

import numpy as np
import matplotlib.pyplot as plt

fig, (ax1,ax2) = plt.subplots(1,2)

ax1.imshow(np.random.random((100,100)))
ax2.plot(np.random.random((100)))
ax2.yaxis.tick_right()

fig.tight_layout(pad=0.0)
fig.savefig("test.png")

这样做的结果是 未对齐的 imshow 和 plot 的结果

我基本上想要右边的子图和左边的子图高度一致(并且对齐),而且它们之间没有间隙。

我可以通过调整 figsize 来部分实现这个目标,但这会非常麻烦。特别是如果图的其他部分发生变化,就需要多次调整 figsize

fig, (ax1,ax2) = plt.subplots(1,2, figsize=(8,4))

使用 figsize 对齐的 imshow 和 plot 的结果

1 个回答

0

虽然 subplot 通常能很好地自动安排图形的位置,但当你需要手动调整时,可以使用 axes 来自己设置位置。这可以解决你图形之间的间距问题。关于 rect 的具体说明可以在 这里 找到。

关于图形的长宽比问题就复杂一些,我相信还有比这个方法更简单的解决方案。你可以通过 axes 方法中的 aspect 关键字来指定图形的长宽比,这个长宽比是根据你展示的图像来决定的。

下面的代码片段展示了如何使用 axesaspect

import numpy as np
from matplotlib import pyplot as plt

N = 100
yRange = 1.0
x = np.arange(N)
y = np.random.random((N))*yRange

imageX = 100
imageY = 150
image = np.random.random((imageY,imageX))

imageAspect = float(imageY)/float(imageX)

myDataAspect = float(N)/yRange * imageAspect

fig = plt.figure()
ax1 = plt.axes([0.05,0.05,0.45,0.9])
ax2 = plt.axes([0.5,0.05,0.45,0.9], adjustable='box', aspect=myDataAspect)
ax2.yaxis.tick_right()

ax1.imshow(image)
ax2.plot(x,y)

fig.savefig("test.png")

plt.show()

撰写回答