先日、AmbientのPythonライブラリーを拡張し、Ambientのデーターを読み込めるようにしました。pandas、matplotlibと組み合わせてPythonで柔軟なグラフ化ができるようになりました。

Ambientではチャネル設定ページでd1からd8までのデーターに名前をつけたり、チャネルの位置情報を設定したり出来ます。これらのチャネル情報をPythonで取得できるようにライブラリーを拡張しました。これにより、Ambientに設定したデーター名をmatplotlibのグラフの凡例、グラフ軸名などに反映できるようになりました。

ライブラリーの拡張

新たにgetprop()というメソッドを追加しました。

In [1]:
import ambient
am = ambient.Ambient(102, '')
prop = am.getprop()
prop['d1']['name']
Out[1]:
'温度(℃)'
 

d1に設定したデーター名はprop[‘d1’][‘name’]で参照できます。

In [2]:
d = am.read(date='2017-03-03')
import pandas as pd
import numpy as np
from datetime import datetime as dt
import pytz
df = pd.DataFrame(d)
df['created'] = pd.to_datetime(list(df['created'])).tz_localize('GMT').tz_convert('Asia/Tokyo')
 

matplotlibのグラフの凡例、グラフ軸名に反映させる

getprop()で取得したデーター名をmatplotlibのグラフで使うには、次のようにします。 matplotlibはそのままでは日本語が表示されないので、次のように日本語のフォントを指定します。

In [3]:
%matplotlib inline
import matplotlib.pyplot as plt
from matplotlib import font_manager
fontprop = font_manager.FontProperties(fname="/Library/Fonts/Osaka.ttf")
 

font_managerで指定しているフォントの場所はお使いの環境に合わせて修正してください。

例ではd1が温度ですが、これをグラフ化して凡例とy軸名を表示するのは次のようにします。

In [4]:
plt.figure()
df.plot(x='created', y='d1')
plt.legend([prop['d1']['name']], prop = fontprop)
plt.ylabel(prop['d1']['name'], fontproperties=fontprop)
Out[4]:
<matplotlib.text.Text at 0x117552ac8>
 
<matplotlib.figure.Figure at 0x115144dd8>
 
 

Ambientで設定したデーター名が凡例とy軸の名前として反映されているのが確認できます。

d1(温度)とd2(湿度)を左右のy軸でグラフ化し、凡例とy軸名を表示するのは次のようにします。

In [5]:
fig, ax1 = plt.subplots()
ax1.plot(df['created'], df['d1'])
ax1.set_ylabel(prop['d1']['name'], fontproperties=fontprop)
ax2 = ax1.twinx()
ax2.plot(df['created'], df['d2'], 'r')
ax2.set_ylabel(prop['d2']['name'], fontproperties=fontprop)
lines, labels = ax1.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
l = list(map((lambda x: prop[x]['name']), labels))
l2 = list(map((lambda x: prop[x]['name']), labels2))
ax2.legend(lines + lines2, l + l2, prop=fontprop)
plt.show()
 
 

日本語で左右のy軸に軸名をつけ、凡例もつけられるようになりました。