我想一个网格图与m行和n列显示共享两个子图之间的x和y轴,他们之间没有空格。这很容易在Matplotlib中用简单的plot实现,就像下面的代码一样
def plot_me():
n = 4
m = 5
f, axs = plt.subplots(m,n, sharex=True, sharey=True, gridspec_kw=dict(hspace=0, wspace=0))
x = np.arange(44)
for i in range(m):
for j in range(n):
axs[i,j].plot(np.sin(x*(i*j+1)))
但是当我把axs[i,j].plot()
改为axs[i,j].imshow()
时,列之间有一个垂直的空格,而不是水平的!为什么会这样?
def imshow_me():
n = 4
m = 5
f, axs = plt.subplots(m,n, sharex=True, sharey=True, gridspec_kw=dict(hspace=0, wspace=0))
for i in range(m):
for j in range(n):
axs[i, j].imshow(np.random.random((100, 100)))
我也尝试了f.subplots_adjust(wspace=0, hspace=0)
,但结果相同。并且还与镶嵌图,并再次在一个轴没有空白,而在另一个。
我在Visual Studio Code 1.78.2和matplotlib 3.7.1中使用Python 3.11.2
先谢谢你了。
编辑,与@jared链接线程Matplotlib adjust image subplots hspace and wspace相比,与简单的plot
相比,imshow
没有提出特定的问题,也没有令人满意的解决问题的答案。
对我来说,解决这个问题的方法是使用pcolormesh
,正如@jared评论所说。或者,正如@gboffi所解释的,可以强制图的高/宽比为 * 精确地 * 1.5,以避免空格
1条答案
按热度按时间svmlkihl1#
imshow
用于图像,图像 * 通常 * 以平方像素表示。如果一个图像是200像素宽,300像素高,Matplotlib会在屏幕上放置一个长宽比为1.5的矩形(实际像素数不是200 x300),然后绘制轴框架,包括脊柱,标签等,适合显示的图像,或者在您的情况下,只是框架。
如果子图的长宽比(h/w)恰好是1.5,我的意思是在考虑了图的大小、轴刻度、刻度标签、标题等之后,恰好1.5,那么一切都适合,否则......
最终,如果
figsize
* 太宽 *,则水平添加不需要的空白,或者如果figsize
* 太高 *,则水平添加不需要的空白,如以下示例所示: