TOP

Pythonでpandas,matplotlibを使って描画したグラフを画像に保存するまでのメモ

2016-11-01 16:35:02

TSL2561で取得したルクスを記録したCSVを読み込んでそれをグラフに描画するまでのメモ

使用するパッケージ

    $ cat packages.txt
    cycler==0.10.0
    matplotlib==1.5.3
    numpy==1.11.2
    pandas==0.19.0
    pyparsing==2.1.10
    python-dateutil==2.5.3
    pytz==2016.7
    six==1.10.0

必要な物を入れる

python-tkが必要(ヘッドレス環境の人は要らないかも)

$ sudo apt-get install -y python-tk

デフォルトの描画エンジンを書き換える

この作業は、ディスプレイがある環境の人は要らないかも

なんでもmatplotlibはデフォルトのエンジンがTkAggに設定されていて、ヘッドレス環境でたとえ描画処理を行っていなくても(=ファイル出力のみでも)、以下のエラーが出ました

File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1813, in __init__
    self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)

_tkinter.TclError: no display name and no $DISPLAY environment variable

一時的にXvfbに描画してたんですが、これのために仮想フレームバッファ用意するのもなんかなーという感じだったので、根本的に解決する方法を調べました

pythonでmatplotlibインポート時に、デフォルトのエンジンをTkAggから、Aggに切り替えて上げればよいみたいです

import matplotlib as plt
plt.use('Agg')

CSVを用意する

$ cat datetime.csv
datetime, lux
"15:55", 3269
"16:00", 3358
"16:05", 1689
"16:10", 1123
"16:15", 2535

描画する

plt.use('Agg')の行は、各自の環境に合わせて置き換えて下さい(ディスプレイがある=TkAggの人は行自体不要)

$ cat test.py
import pandas as pd
import matplotlib as plt
plt.use('Agg')

df = pd.read_csv('datetime.csv')
# df.index = pd.to_datetime(df.index)
df.plot(x='datetime')

# plt.pyplot.show()
plt.pyplot.savefig("datetime.png")

描画したらこのようになりました