子图中的imshow与plot共享同一尺寸
我有两个子图,一个是用 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")
这样做的结果是
我基本上想要右边的子图和左边的子图高度一致(并且对齐),而且它们之间没有间隙。
我可以通过调整 figsize
来部分实现这个目标,但这会非常麻烦。特别是如果图的其他部分发生变化,就需要多次调整 figsize
。
fig, (ax1,ax2) = plt.subplots(1,2, figsize=(8,4))
1 个回答
0
虽然 subplot
通常能很好地自动安排图形的位置,但当你需要手动调整时,可以使用 axes
来自己设置位置。这可以解决你图形之间的间距问题。关于 rect
的具体说明可以在 这里 找到。
关于图形的长宽比问题就复杂一些,我相信还有比这个方法更简单的解决方案。你可以通过 axes
方法中的 aspect
关键字来指定图形的长宽比,这个长宽比是根据你展示的图像来决定的。
下面的代码片段展示了如何使用 axes
和 aspect
。
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()