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

使用するパッケージ

  • pandas : データ解析支援ライブラリ
  • NumPy : 数値計算ライブラリ
  • matplotlib : NumPyを基盤にしたグラフ描画ライブラリ
1
2
3
4
5
6
7
8
9
$ 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")

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