无窗口绘制和写入图像文件

时间:2012-07-10 09:35:05

标签: python linux matplotlib

我发现只使用matplotlib将图表绘制到文件中并不像阅读教程那样容易。 在教程中解释说,您只是累积数据,然后:

import matplotlib.pyplot as plt
# ... fill variables with meaningful stuff
plt.plot(data.x,data.y,format_string)
plt.savefig(filename)

完成了。如果你只是将它作为shell执行,那也可以正常工作。但是,如果您将此代码提供给没有任何窗口的进程(如jenkins),那么您只会收到以下错误:

Traceback (most recent call last):
  File "./to_graph.py", line 89, in <module>
    main()
  File "./to_graph.py", line 78, in main
    plt.plot(warnings[0],warnings[1],args.format_warnings,label="Warnings")
  File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 2460, in plot
    ax = gca()
  File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 701, in gca
    ax =  gcf().gca(**kwargs)
  File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 369, in gcf
    return figure()
  File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 343, in figure
    **kwargs)
  File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_tkagg.py", line 80, in new_figure_manager
    window = Tk.Tk()
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1688, in __init__
    self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: no display name and no $DISPLAY environment variable

我理解堆栈跟踪行周围的源代码,这个错误的原因是backend_tkagg.py期望使用现有窗口(请参阅stacktrace中的Tk.Tk()行)。所以我想知道是否有办法用matplotlib(或者python)绘制图表,而不依赖于窗口(-manager)来完成工作。

2 个答案:

答案 0 :(得分:5)

您需要设置一个直接写入文件的后端。

详情请见: http://matplotlib.sourceforge.net/faq/usage_faq.html#what-is-a-backend

您需要在导入pyplot之前调用matplotlib.use。

例如:

import matplotlib
matplotlib.use("AGG")
import pyplot
# continue as usual

实际上,我刚刚发现这也是文档中给出的解决方案:

http://matplotlib.sourceforge.net/faq/howto_faq.html#generate-images-without-having-a-window-appear

答案 1 :(得分:1)

谢谢!我也有这个问题。现在我可以使用图像生成Raspberry并在图形环境中使用pyplot未使用的变量进行保存。这是一个例子:

pi @ raspberrypi / var / www $ cat testimgpython.py

import matplotlib
matplotlib.use('AGG')
import matplotlib.pyplot as plt
senial = [2, 3, 5, 8, 20, 50, 100]
tiempo = range(len(senial))
plt.plot(tiempo, senial)
plt.savefig('/var/www/imageSimple1.png')
print 'Hecho!'