如果您创建图形而不使用plt.figure
,则它应该像您期望的那样被引用计数。例如(这是使用非交互式Agg后端的情况)。
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.figure import Figure
# The pylab figure manager will be bypassed in this instance.
# This means that `fig` will be garbage collected as you'd expect.
fig = Figure()
canvas = FigureCanvas(fig)
ax = fig.add_subplot(111)
FigureCanvas(fig)
,在尝试保存图形时会引发异常。我理解必须始终使用 FigureCanvas
绘制一个 Figure
吗? - Shepcanvas.print_figure(filename)
而不是fig.savefig(filename)
可能更有意义(实际上,fig.savefig
在幕后执行的就是这个操作)。然而,这仅供您自己理解(画布是处理绘制/保存的特定于后端的部分)。最终结果是相同的。 - Joe Kingtonmatplotlib.get_backend()
函数可以获得当前启用的后端名称(如果有的话),但通用的解决方案需要该后端实际在内存中的模块对象。Matplotlib 似乎没有相应的获取器。 - Cecil Currypyplot
API 对我们来说是不可行的。我们还需要根据平台动态利用不同的后端(例如,在 OS X 上使用 MacOSX
,在 Linux 上使用 TkAgg
,在 Windows 上使用 Odin 等)。但感谢 Joe 的迅速和有帮助的回复!你的优秀之处是无与伦比的。正如你所建议的那样,我们将尝试进行动态后端导入。 - Cecil Curry如果你只想保存图像而不显示它们,可以使用以下代码:
def savefig(*args, **kwargs):
plt.savefig(*args, **kwargs)
plt.close(plt.gcf())
这可能看起来并不可靠,但是无论如何。
delete
”来回答“如何在C++中使用智能指针”的问题。 - Shepplt
API。 - 1''pyplot
获得收益,并且有可能将图形包装在自己的类中,可以使用你的类的 __del__
方法来关闭图形。例如:import matplotlib.pyplot as plt
class MyFigure:
"""This is my class that just wraps a matplotlib figure"""
def __init__(self):
# Get a new figure using pyplot
self.figure = plt.figure()
def __del__(self):
# This object is getting deleted, close its figure
plt.close(self.figure)
matplotlib
图形将被关闭。但请注意,如果有人抓住了这个图形(但没有抓住您的包装器),他们可能会对您关闭它感到烦恼。这可能需要一些思考或对使用进行一些限制来解决。
plt.figure()
是构造函数,而plt.close(fig)
是析构函数。虽然由于clf
、cla
和其他因素存在许多级别的销毁。在这种情况下,正确的方法是使用“with”括号惯用语(“上下文管理器”)。 - CMCDragonkai