matplotlib.pyplot.imshow:使用“sharex”和“sharey”属性时去除图形中的空白空间

13 投票
3 回答
13938 浏览
提问于 2025-04-17 17:06

我遇到的问题和这里提到的很相似。不同的是,当我绘制两个共享坐标轴的子图时,图表区域内出现了不想要的白色空隙。即使我设置了autoscale(False),这些白色空隙依然存在。比如,我使用了和上面提到的帖子中答案类似的代码:

import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.add_subplot(2, 1, 1)
ax.imshow(np.random.random((10,10)))
ax.autoscale(False)
ax2 = fig.add_subplot(2, 1, 2, sharex=ax, sharey=ax)   # adding sharex and sharey
ax2.imshow(np.random.random((10,10)))
ax2.autoscale(False)
plt.show()

结果是这张图片。

我还尝试了根据这里的建议,使用ax.set_xlim(0, 10)ax.set_xbound(0, 10),但都没有效果。我该如何去掉多余的白色空隙呢?任何建议都非常感谢。

3 个回答

1

问题出在使用 add_subplot 时的那些有用的工具上。注意,当你调整图形大小时,白色空白的部分会发生变化。

下面的代码似乎可以解决这个问题(直到你再次调整图形大小)

import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure(figsize=(5, 5))
ax = fig.add_axes([.3, .55, .35, .35]) 
ax.imshow(np.random.random((10,10)))
ax.autoscale(False)
ax2 = fig.add_axes([.3,  .05, .35, .35], sharex=ax, sharey=ax ) 
ax2.imshow(np.random.random((10,10)))
ax2.autoscale(False)

plt.show()

这看起来是 axes 对象的大小和位置、共享坐标轴,以及 imshow 的等比例显示之间的不良互动。

如果你不在乎坐标轴的刻度,可以尝试下面的代码

ax.set_axis_off()
ax2.set_axis_off()

我觉得在 matplotlib 的 GitHub 上提个问题是值得的。

3

使用 plt.subplots 的方法是:

fig, ax = plt.subplots(nrows=2, ncols=1, sharex=True, sharey=False)
ax[0].imshow(np.random.random((10,10)))
ax[0].autoscale(False)
ax[1].imshow(np.random.random((10,10)))
ax[1].autoscale(False)

这样做后,我得到了如图所示的效果 this figure,在坐标轴内没有留白。通过在 plt.subplots 中使用 figsize 或者 fig.subplots_adjust,你可以获得更好的坐标轴比例。

17

正如这里提到的,添加以下内容:

ax.set_adjustable('box-forced')
ax2.set_adjustable('box-forced')

就能解决这个问题。

(文档)

撰写回答