如何在活动打印期间删除matplotlib中不可见轴的空白?

如何在活动打印期间删除matplotlib中不可见轴的空白?,matplotlib,Matplotlib,我想在活动绘图期间完全删除轴周围的空白(而不是像其他人要求的那样保存图)。 这里我们不能使用bbox\u inches='tight'。我可以使用紧凑的布局(pad=0)。 当axis处于启用状态时,它工作正常,显示所有记号和x-y标签。 但是,在某些情况下,我将轴设置为关闭状态。我所期望的是看到内容扩展以填充轴所在的空白空间。然而,这是行不通的。它仍然保留填充,因为仍然有x-y标签和轴。 如何删除不可见轴对象的空白? 编辑: 我知道我可以使用ax.set_-yticks([])和ax.set_

我想在活动绘图期间完全删除轴周围的空白(而不是像其他人要求的那样保存图)。 这里我们不能使用
bbox\u inches='tight'
。我可以使用紧凑的布局(pad=0)。 当axis处于启用状态时,它工作正常,显示所有记号和x-y标签。 但是,在某些情况下,我将轴设置为关闭状态。我所期望的是看到内容扩展以填充轴所在的空白空间。然而,这是行不通的。它仍然保留填充,因为仍然有x-y标签和轴。 如何删除不可见轴对象的空白? 编辑:

我知道我可以使用
ax.set_-yticks([])
ax.set_-xticks([])
来关闭它们。但这太笨拙了,我必须在清除蜱虫之前记住它们。如果我去掉了,再加上那些记号。滴答声不能再自动更新了。 我想知道有没有更直接的方法

我们仍然可以看到,即使删除了所有记号,边界间距仍然很小。如果有人能想出一个办法来消除它。这将是美妙的

如果有的话,我也想保留这个头衔。因此,硬编码的
ax.set_位置([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

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

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\u figure
bool检查):

ax.set\u位置
需要在
fig.tight\u布局
之后。 如果需要图形标题,则没有直接的方法。不幸的是,这是无法避免的。您需要手动调整
高度
参数,以使标题适合图形,例如:

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

根据是否关闭轴,可以调整子批次参数

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\u tight\u布局(axisoff=True)

并且
demo\u-tight\u布局(axisoff=False)


请注意,如果只描述问题,则总是很难把握问题。相反,为什么不创建一个显示问题的脚本呢?您是作为脚本或在控制台中运行此脚本,还是在jupyter笔记本中使用内联打印?每种情况都可能有自己的最佳解决方案。console/script。无需优化Jupyter问题是,当有标题时,这会使其消失。如果你想有标题,你需要做如下变通:
ax.set_position([0,0,1,9],which='tware')
。我不喜欢这种硬编码的间距,当你允许人们改变字体大小和多行标题时,这是非常笨拙的。是的,我也是。但不幸的是,没有简单的解决办法。这是matplotlib的一个问题。Imho最简单的解决方法是将图形保存为svg,在类似Inkscape的svg编辑器中打开它,标记透明背景,删除它,并将Inkscape文档调整为图形大小。对不起,这是最简单的方法。
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()