在Mac OS X上使用matplotlib进行非交互式绘图
我在我的应用程序中使用了 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的动态特性)我不需要修改源代码。这样我就可以为每个图设置文件名,这正是我需要的。