Subplot imshow和绘图共享相同的尺寸

时间:2014-06-25 19:56:00

标签: python matplotlib

我有两个子图,ax1.imshowax2.plot。我希望imshow保留其原始宽高比,我希望plotimshow具有相同的高度。另外我希望两个子图之间没有间隙,这意味着两个黑色边框应该紧挨着彼此或重叠。

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")

给出结果Result of non-aligned imshow and plot

我基本上希望右子图与左子图具有相同的高度(并且对齐),并且两个子图之间没有间隙。

我可以通过调整figsize来实现这一点,但这可能非常繁琐。特别是如果图中的其他部分发生变化,则需要多次调整figsize

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

Result of aligned imshow and plot using figsize

1 个答案:

答案 0 :(得分:0)

虽然subplot通常可以自动定位,但您可以在需要时使用axes手动定位它们。这解决了你的情节之间的空间问题。请参阅rect here的规范。

纵横比问题比较棘手,我确信有比这更简洁的方法。您可以根据所显示图像的宽高比指定绘图的宽高比(使用aspect方法的axes关键字)。

下面的代码段说明了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()