如何消除图像和线图之间的空白?将 'hspace' 设置为 0 不起作用

How to eliminate whitespace between an image and a line plot? Setting 'hspace' to 0 doesn't do it

所以我试图在 Matplotlib 中获取强度图和光谱图像。但这行不通。我尝试了 this and this 问题中建议的大部分内容,但这些都是针对同一类型的子图,并且 none 使差距消失了。我在我的代码中使用的那个,在 plt.subplots() 中设置关键字参数 gridspec_kw = {'wspace':0, 'hspace':0} 对我来说似乎是最合理的,但它也失败了。我应该如何消除图像和绘图之间的所有空白?

我的 Matplotlib 版本是 2.2.2

代码:

impath = "Picture349.jpg" #a pic from the spectroscope
image = Image.open("Picture349.jpg")
imx, imy = image.size
imarray = np.asarray(image)
plt.imshow(image)

fig, (axint, axim) = plt.subplots(2,1, gridspec_kw = {'wspace':0, 'hspace':0}, sharex=True)

#get a single row of pixels from the middle of the image, extend and plot it
pixrownum = imy//2
colorcol = imarray[pixrownum]
rainbow = np.broadcast_to(colorcol, (100, *colorcol.shape))
axim.imshow(rainbow)
axim.get_yaxis().set_visible(False)

#get and plot intensity
bw = image.convert("L")
xcoords = np.arange(imx)
bwarray = np.asarray(bw)
axint.plot(xcoords, bwarray[pixrownum], "b")
axint.get_xaxis().set_visible(False)

plt.show()

结果:

问题的出现是因为在 plt.imshow() 中您的图片的纵横比默认设置为 "equal"。这会改变子图的布局并干扰 hspace 参数。

您有 2 个选项。首先,您可以将图像的宽高比设置为 "auto" 并保持 hspace 为 0。但是,如果宽高比很重要,则可以通过设置负值来手动调整 hspace 参数。

使用一个简单的例子:

image = np.random.randint(0,20,(300,1300)) # fake data

# ====== Option 1 ======
fig, (axint, axim) = plt.subplots(2, 1, gridspec_kw = {'hspace':0})
axim.imshow(image, aspect="auto")

# ====== Option 2 ======
# fig, (axint, axim) = plt.subplots(2, 1, gridspec_kw = {'hspace':-0.23})
# axim.imshow(image)

axim.get_yaxis().set_visible(False)

axint.plot(np.arange(0,1300), np.random.randn(1300), "b")
axint.get_xaxis().set_visible(False)

plt.show()

两种方法给出:

如果宽高比不重要,我认为选项 1 更好。选项 2 需要反复试验才能找到 hspace 的正确参数。此外,如果您通过拖动 window 来更改图形大小,选项 2 将无法正确缩放