【问题标题】:How to remove horizontal whitespace between matplotlib subplots with imshow如何使用 imshow 删除 matplotlib 子图之间的水平空白
【发布时间】:2022-06-10 22:27:37
【问题描述】:

我有以下代码,我正在尝试删除 3 个子图之间的空间。 gridspec.GridSpecfig.subplots_adjust 我都试过了,都失败了。

各个颜色条应该像现在一样在那里。

有什么想法吗?

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.axes_grid1 import make_axes_locatable

# random data
x1 = np.random.rand(1,10)
x2 = np.random.rand(1,10)
x3 = np.random.rand(1,10)

nrow, ncol = 3, 1
fig, axes = plt.subplots(nrow,ncol, figsize=(12,8))
fig.subplots_adjust(wspace=0.01, hspace=0.01)
axes = axes.flatten()

cmaps = ['Greens_r', 'Reds', 'jet']
x_all = [x1,x2,x3]

for i in range(3):
        im = axes[i].imshow(x_all[i], cmap=cmaps[i])
        #plt.colorbar(im, ax=axes[i])

        axes[i].set_xticklabels([])
        axes[i].set_yticklabels([]) 
        axes[i].set_xticks([])
        axes[i].set_yticks([])
        
        #Make an axis for the colorbar on the right side
        divider = make_axes_locatable(axes[i])
        cax = divider.append_axes("right", size="5%", pad=0.05)
        fig.colorbar(im, cax=cax)
        

【问题讨论】:

  • 您想保持像素为正方形吗?如果没有,那么您可以在对imshow 的调用中使用aspect="auto"
  • 首先,建议使用inset_axes作为颜色条,而不是旧的工具包。其次,你真的不能轻易做到这一点。减少空白的最佳方法是调整图形的纵横比
  • @DavidG 确实解决了这个问题。但是如果我想保持像素正方形呢?
  • @JodyKlymak 感谢您的提示。我没有意识到这一点。我会检查它

标签: python matplotlib imshow


【解决方案1】:

您可以先按原样绘制图形,然后通过移动它们之间的间隙减去某个space 来调整上下轴相对于中间轴的位置。如果您按照乔迪的建议使用inset_axes,这是最简单的。

import matplotlib.pyplot as plt
import matplotlib.transforms as mt
import numpy as np

# random data
np.random.seed(42)
x1 = np.random.rand(1,10)
x2 = np.random.rand(1,10)
x3 = np.random.rand(1,10)

nrow, ncol = 3, 1
space = 0.01
fig, axes = plt.subplots(nrow, ncol, figsize=(12,6))

cmaps = ['Greens_r', 'Reds', 'jet']
x_all = [x1,x2,x3]

for i in range(3):
        im = axes[i].imshow(x_all[i], cmap=cmaps[i])
        axes[i].axis('off')
        cax = axes[i].inset_axes([1 + space, 0, 0.05, 1])
        fig.colorbar(im, ax=axes[i], cax=cax)

fig.canvas.draw()
t = mt.Affine2D().translate(0, axes[1].get_position().y1 - axes[0].get_position().y0 + space)
axes[0].set_position(mt.TransformedBbox(axes[0].get_position(), t))
t = mt.Affine2D().translate(0, axes[1].get_position().y0 - axes[2].get_position().y1 - space)
axes[2].set_position(mt.TransformedBbox(axes[2].get_position(), t))

【讨论】: