如何在活动图中删除matplotlib中不可见轴的空白区域?

时间:2018-05-28 08:48:42

标签: matplotlib

我希望在活动情节期间完全消除我的轴周围的空白区域(而不是像其他人要求的那样save_fig)。 在这里,我们无法使用bbox_inches='tight'。我可以使用tight_layout(pad = 0)。 当轴打开时,它工作正常,它显示所有刻度和x-y标签。 visible axes 但是,在某些情况下,我将轴设置为关闭。我期望看到内容扩展以填充轴所在的空白区域。但是,这不起作用。它仍然保持填充,因为仍然有x-y标签和轴。 invisible axes 如何删除隐形轴对象的空白区域? expected result 修改

我知道我可以使用ax.set_yticks([])ax.set_xticks([])将其关闭。但这很笨拙,我必须在清除之前记住蜱虫。如果我删除 - 然后添加那些刻度。刻度线不能再自动更新。 我想知道有没有更直接的方法呢?

即使删除了所有刻度,我们仍然可以看到边界间距很小。如果有人可以找到一种方法来删除它。太棒了。

我还想保留标题,如果有的话。因此,硬编码的ax.set_position([0,0,1,x])对于这种用法并不是很好。当有标题时我们仍然可以尝试获得顶部间距,但如果有人可以提供更直接/简单的方法来处理这个问题,那么它将是首选。

示例代码:

def demo_tight_layout(w=10, h=6, axisoff=False, removeticks=False):

    fig,ax = plt.subplots()
    fig.set_facecolor((0.8, 0.8, 0.8))
    rect = patches.Rectangle((-w/2, -h/2), w, h, color='#00ffff', alpha=0.5)
    ax.add_patch(rect)
    ax.plot([-w/2,w/2], [-h/2,h/2])
    ax.plot([-w/2,w/2], [h/2,-h/2])
    ax.set_ylabel("ylabel")
    ax.margins(0)
    _texts = []
    if axisoff:
        ax.set_axis_off()
        _texts.append("axisoff")
    if removeticks:
        ax.set_xticks([])
        ax.set_yticks([])
        ax.set_ylabel("")
        _texts.append("removeticks")
    fig.text(0.5, 0.6, " ".join(_texts))

    fig.tight_layout(pad=0)
    plt.show()
    return fig, ax, text

2 个答案:

答案 0 :(得分:1)

您可以根据是否关闭轴来调整子图参数。

import matplotlib.pyplot as plt
from matplotlib import patches

def demo_tight_layout(w=10, h=6, axisoff=False):

    fig,ax = plt.subplots()
    fig.set_facecolor((0.8, 0.8, 0.8))
    rect = patches.Rectangle((-w/2, -h/2), w, h, color='#00ffff', alpha=0.5)
    ax.add_patch(rect)
    ax.plot([-w/2,w/2], [-h/2,h/2])
    ax.plot([-w/2,w/2], [h/2,-h/2])
    ax.set_ylabel("ylabel")
    ax.margins(0)
    _texts = []

    fig.tight_layout()
    if axisoff:
        ax.set_axis_off()
        _texts.append("axisoff")
        params = dict(bottom=0, left=0, right=1)
        if ax.get_title() == "":
            params.update(top=1)
        fig.subplots_adjust(**params)

    fig.text(0.5, 0.6, " ".join(_texts))

    plt.show()

现在demo_tight_layout(axisoff=True)生成

enter image description here

demo_tight_layout(axisoff=False)生成

enter image description here

答案 1 :(得分:0)

您需要设置轴位置以填充图形。如果您使用

创建图形和绘图
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.gca()
ax.plot(some_x_data, some_y_data)

您需要添加以下行以使用轴填充图形:

ax.set_position([0, 0, 1, 1], which='both')

这将按以下方式设置相对于图形尺寸的轴位置:

[left, bottom, width, height]

如上所示,要完全填充数字,请使用[0, 0, 1, 1]

所以拿你的代码,它应该是这样的(使用fill_figure bool来检查):

def demo_tight_layout(w=10, h=6, axisoff=False, removeticks=False, fill_figure=False):

    fig,ax = plt.subplots()
    fig.set_facecolor((0.8, 0.8, 0.8))
    rect = patches.Rectangle((-w/2, -h/2), w, h, color='#00ffff', alpha=0.5)
    ax.add_patch(rect)
    ax.plot([-w/2,w/2], [-h/2,h/2])
    ax.plot([-w/2,w/2], [h/2,-h/2])
    ax.set_ylabel("ylabel")
    ax.margins(0)
    _texts = []
    if axisoff:
        ax.set_axis_off()
        _texts.append("axisoff")
    if removeticks:
        ax.set_xticks([])
        ax.set_yticks([])
        ax.set_ylabel("")
        _texts.append("removeticks")
    fig.text(0.5, 0.6, " ".join(_texts))

    fig.tight_layout(pad=0)
    if fill_figure:
        ax.set_position([0, 0, 1, 1], which='both')
    plt.show()
    return fig, ax, text

ax.set_position需要在fig.tight_layout之后。 如果需要图形标题,则没有直接的方法可以做到。不幸的是,这是不可避免的。您需要手动调整height参数,以使标题适合图中,例如:

ax.set_position([0, 0, 1, .9], which='both')