在Mac OS X上使用matplotlib进行非交互式绘图

时间:2010-07-12 16:18:52

标签: python macos matplotlib

我在我的应用程序中使用scipy-cluster。它提供了绘制分层聚类树的树形图的功能。查看源代码,我发现它最终通过调用draw_if_interactive来绘制树形图。正如人们所料,这在交互式会话中工作正常,但是当我以非交互方式运行脚本时,会弹出一个窗口并立即消失(我已将matplotlib配置为使用macosx-backend)。我需要一种方法让我的应用程序等到用户关闭显示绘图的窗口,或者让它直接渲染到文件中(实际上我更喜欢)。同样,问题是,我无法修改生成绘图的代码,因此解决方案可能涉及matplotlib的某些配置设置或类似的东西。

编辑:我将当前的解决方法添加为答案,以便其他人可以使用它。由于它非常难看,我将把这个问题留下来,希望有人能提出更好的解决方案。

2 个答案:

答案 0 :(得分:1)

macosx后端不能正确支持非交互模式(即设置交互式关闭无效)。您可能更喜欢使用AGG backend -

import matplotlib
matplotlib.use('AGG')

答案 1 :(得分:0)

所以,这就是我现在想出的:

class myplot(object):
    def __init__(self, filename):
        self._filename = filename

    def resetFileName(self, fileName):
        self._filename = fileName

    def __call__(self):
        matplotlib.pylab.savefig(self._filename)

plotfunction = myplot("foo.png")
matplotlib.pylab.draw_if_interactive = plotfunction

必须在导入hcluster - 模块后执行此操作。这在很多方面都是丑陋的,但至少(由于Python的动态特性)我不必修改源代码。它让我为每个情节设置文件名,这正是我需要的。