matplotlib.pyplot.imshow:在使用属性“sharex”和“sharey”时删除图表内的空白区域

13

我有一个问题,类似于这里发布的问题。不同之处在于,当我绘制两个通过sharexsharey属性共享轴的子图时,在图形区域内会出现不需要的空白间隔。即使设置了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()

导致this图像的结果。

我也尝试过ax.set_xlim(0, 10)ax.set_xbound(0, 10),根据here的建议,但都没有用。如何去掉额外的空白?任何想法都将不胜感激。

3个回答

17
此处所建议,添加:
ax.set_adjustable('box-forced')
ax2.set_adjustable('box-forced')

解决问题。
文档

1
这很有帮助,但如果您不介意失去纵横比并想填充所有可用的轴空间,则可以使用imshow()中的aspect ='auto'来添加另一种方式。 - PlasmaBinturong

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)

我得到了这个图像此图,但轴内没有空白。使用plt.subplotsfig.subplots_adjust中的figsize可以获得更好的轴比例。


谢谢。然而,我想要一个解决方案,其中坐标轴的范围不会随着图形的调整大小而改变。 - mlynn
@mlynn:你的意思是什么?你想让你的轴始终保持相同的绝对大小(例如5x5厘米)吗?还是你希望它们独立于图形大小保持相同的纵横比? - Francesco Montesano
我想要的是每个子图显示图像的完整尺寸(在这种情况下为10x10像素),保持相同的纵横比,独立于图形大小。基本上,如果我在上面的原始代码中不添加“sharex”和“sharey”选项,我会得到我想要的绘图。我可以调整图形的大小,每个子图都会相应地调整大小。我希望共享轴的原因是当我放大一个子图时,我希望另一个子图相应地放大。 - mlynn

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上开一个问题(issue)。

1
aspect=auto设置为自动,可以消除此情况下的空白区域,但这并不总是理想的。我按照您的建议在matplotlib的GitHub上开了一个问题--谢谢。 - mlynn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接