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

1 投票
2 回答
1040 浏览
提问于 2025-04-16 01:11

我在我的应用程序中使用了 scipy-cluster。这个库提供了一个功能,可以绘制层次聚类树的树状图。查看源代码后,我发现它最终是通过调用 draw_if_interactive 来绘制树状图的。正如你所想的,这在交互式会话中运行得很好,但当我在非交互式模式下运行脚本时,一个窗口会弹出来,然后立刻消失(我已经把 matplotlib 配置成使用 macosx-backend)。我需要一种方法,要么让我的应用程序等待用户关闭显示图形的窗口,要么直接把图形渲染到一个文件中(其实我更喜欢这个)。问题是,我不能修改生成图形的代码,所以解决方案可能涉及一些 matplotlib 的配置设置或者类似的东西。

编辑:我把我现在的临时解决方案作为一个回答添加上去了,方便其他人使用。虽然这个方法很丑陋,但我会保持这个问题开放,希望有人能提出更好的解决方案。

2 个回答

1

macosx这个后端不太支持非交互模式(也就是说,把交互模式关闭并没有什么效果)。你可能更喜欢使用AGG 后端来处理这个问题 --

import matplotlib
matplotlib.use('AGG')
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的动态特性)我不需要修改源代码。这样我就可以为每个图设置文件名,这正是我需要的。

撰写回答