面向对象的方式在matplotlib中访问fill_between阴影区域

4

我正在尝试获取matplotlib图表的阴影区域,以便在不执行plt.cla()(因为cla()会清除整个轴,包括轴标签)的情况下将其删除。

如果我要绘制一条线,可以这样做:

import matplotlib.pyplot as plt
ax = plt.gca()
ax.plot(x,y)
ax.set_xlabel('My Label Here')

# then to remove the line, but not the axis label
ax.lines.pop()

然而,要绘制一个区域,我执行以下操作:
ax.fill_between(x, 0, y)

因此,ax.lines为空。

请问如何清除这个阴影区域?

1个回答

7
根据文档fill_between返回一个PolyCollection实例。集合存储在ax.collections中。因此,
ax.collections.pop()

这应该能解决问题。

不过,我认为你需要小心确保删除正确的内容,以防ax.linesax.collections中有多个对象。你可以保存一个对该对象的引用,以便知道要删除哪个:

fill_between_col = ax.fill_between(x, 0, y)

然后要移除:

ax.collections.remove(fill_between_col)
编辑: 另一种方法,也可能是最好的方法: 所有艺术家都有一种称为remove的方法,它可以完全满足您的需求。
fill_between_col.remove()

感谢您的有用评论。尝试按名称手动弹出它们是一个好主意,尽管似乎不起作用。如果我这样做: my_line = ax.plot(x,y);my_line.pop()即使使用draw()强制重绘画布后,这也无法删除该行。 - IanRoberts
这不是我建议的。你不能在一个艺术家上调用 pop(),你必须调用:ax.lines.remove(my_line)。另外:ax.plot 总是返回一个列表(因为你可以同时绘制多条线),所以你应该使用 my_line = ax.plot(x,y)[0] - hitzg

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