4

ダイアグラムをファイルに描画するためだけに使用matplotlibすることは、チュートリアルを読んだときほど簡単ではないことがわかりました。チュートリアルでは、データを蓄積してから次のことを説明しています。

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

そして完了。シェルとして実行するだけでも問題なく機能します。ただし、このコードをウィンドウのないプロセス(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が既存のウィンドウを使用することを想定しているためです(スタックトレースのTk.Tk()行を参照)。ですから、ウィンドウ(-manager)に頼らずに、matplotlib(またはpython)で図を描く方法があるのではないかと思います。

4

2 に答える 2