matplotlib,imshow在网格图中的轴之间没有空格

sf6xfgos  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(91)

我想一个网格图与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,以避免空格

svmlkihl

svmlkihl1#

imshow用于图像,图像 * 通常 * 以平方像素表示。
如果一个图像是200像素宽,300像素高,Matplotlib会在屏幕上放置一个长宽比为1.5的矩形(实际像素数不是200 x300),然后绘制轴框架,包括脊柱,标签等,适合显示的图像,或者在您的情况下,只是框架。
如果子图的长宽比(h/w)恰好是1.5,我的意思是在考虑了图的大小、轴刻度、刻度标签、标题等之后,恰好1.5,那么一切都适合,否则......
最终,如果figsize * 太宽 *,则水平添加不需要的空白,或者如果figsize * 太高 *,则水平添加不需要的空白,如以下示例所示:

import matplotlib.pyplot as plt
mat = [[i for i in range(j, j+10)] for j in range(10)]
fig0, axs0 = plt.subplots(2, 2, edgecolor='k', linewidth=1,
    figsize=(6,2), gridspec_kw=dict(hspace=0, wspace=0))
for ax in axs0.flatten(): ax.imshow(mat)
fig1, axs1 = plt.subplots(2, 2, edgecolor='k', linewidth=1,
    figsize=(4,6), gridspec_kw=dict(hspace=0, wspace=0))
for ax in axs1.flatten(): ax.imshow(mat)
plt.show()

相关问题