【问题标题】:matplotlib.pyplot.imshow: removing white space within plots when using attributes "sharex" and "sharey"matplotlib.pyplot.imshow:使用属性“sharex”和“sharey”时删除图中的空白
【发布时间】:2013-02-25 22:03:21
【问题描述】:

我有一个与here 发布的问题类似的问题。不同之处在于,当我绘制两个通过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 图像。

我也按照here的建议尝试了ax.set_xlim(0, 10)ax.set_xbound(0, 10),但无济于事。我怎样才能摆脱多余的空白?任何想法将不胜感激。

【问题讨论】:

    标签: python matplotlib whitespace


    【解决方案1】:

    按照here的建议,添加:

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

    解决问题。

    (documentation)

    【讨论】:

    • 这很有帮助,但如果您不介意丢失纵横比并想要填充所有可用的轴空间,我会添加另一种方法:在 imshow() 中使用 aspect='auto'。跨度>
    【解决方案2】:

    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:你是什么意思?您是否希望您的轴始终保持相同的绝对尺寸(如 5x5 厘米)?或者您希望它们独立于图形大小保持相同的纵横比?
    • 我希望每个子图显示图像的完整尺寸(在本例中为 10x10 像素),保持与图形大小无关的相同纵横比。基本上,如果我不在上面的原始代码中添加sharexsharey 选项,我会得到我想要的图。我可以调整图形的大小,每个子图都会相应地调整大小。我希望共享轴的原因是,当我放大一个子图时,我希望另一个子图相应地放大。
    【解决方案3】:

    问题在于使用 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 上打开一个问题。

    【讨论】:

    • 设置 aspect=auto 在这种情况下会消除空白,但这并不总是理想的。我按照您的建议在 matplotlib github 上打开了一个问题 - 谢谢。
    猜你喜欢
    • 1970-01-01
    • 2013-12-12
    • 1970-01-01
    • 1970-01-01
    • 2022-07-04
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    相关资源
    最近更新 更多