如何在活动打印期间删除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()