如何消除图像和线图之间的空白?将 '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 将无法正确缩放
所以我试图在 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 将无法正确缩放