YAS's VB.NET Tips
 
ラズベリーパイ活用
ラズベリーパイ活用 >> 記事詳細

2019/08/15

BME280のログデータのグラフ化

| by:YAS


 先日作った,BME280ボードを使った,温度・湿度・気圧ロガーのデータをmatplotlibでグラフ化してみました。
 DATA_DIRにあるログデータを読み込んで,PIC_DIRに画像で出力します。
 Y軸のラベルの向きと位置を変えて,Y軸の単位の表示にしていますが,出力画像のサイズを変えると位置がずれてしまいます。Y軸の目盛を3種類にしたり,X軸のラベルを斜めにしたり,少し凝って作ってみました。。
 これを前回作ったロガーと合体させて。1つにし,簡易Webサーバーで外部から参照できるように機能追加しようと思っています。

☆コード
 pygameではデフォルトでは日本語を表示できないので,IPAゴシックをダウンロードし,同じフォルダに配置して使っています。
import csv
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import matplotlib.font_manager as mfontm
import matplotlib.dates as mdates
import datetime

DATA_DIR = "./BME280log/" # データのあるディレクトリ
LOG_NAME = " BME280.log" # 入力ログファイル名
PIC_DIR = "./BME280log/" # 画像を出力するディレクトリ
PIC_NAME = " BME280.png" # 出力画像ファイル名
PIC_SIZE = (4.83.2# 出力画像サイズ(480 x 320)
LINE_WIDTH = 1 # 折れ線グラフの線の太さ
DAYS_AGO = 0  # DAYS_AGO日前のデータを使う

# データを読み込む
timestamps = []
tempertures = []
humidities = []
pressures = []
date = "{0:%Y.%m.%d}".format(datetime.date.today() - datetime.timedelta(days=DAYS_AGO))
log_filename = DATA_DIR + date + LOG_NAME
with open(log_filename, "r"as f:
    reader = csv.reader(f)
    for row in reader:
        timestamps.append(datetime.datetime.strptime(row[0] ,"%Y/%m/%d %H:%M:%S"))
        tempertures.append(float(row[1]))
        humidities.append(float(row[2]))
        pressures.append(float(row[3]))
# グラフ作成
# フォントファイルの指定
fp = mfontm.FontProperties(fname="./ipag.ttf")
# 3つ重ね合わせたグラフ作成
fig = plt.figure(figsize=PIC_SIZE)
plt.subplots_adjust(left=0.07, bottom=0.15, top=0.9, right=1)
ax1 = fig.add_subplot(111)
ax2 = ax1.twinx()
ax3 = ax1.twinx()
ax1.plot(timestamps, tempertures, color='orange', alpha=1.0, lw=LINE_WIDTH, antialiased=True)
ax2.plot(timestamps, humidities, color='deepskyblue', alpha=0.6, lw=LINE_WIDTH, antialiased=True)
ax3.plot(timestamps, pressures, color='green', alpha=0.8, lw=LINE_WIDTH, antialiased=True)
# Y軸の目盛り設定
ax1.set_ylim(040)
ax2.set_ylim(0100)
ax3.set_ylim(9601020)
ax1.yaxis.set_major_locator(ticker.MultipleLocator(5))
ax2.yaxis.set_major_locator(ticker.MultipleLocator(10))
ax3.yaxis.set_major_locator(ticker.MultipleLocator(10))
# 気圧の目盛りを外側に表示する
fig.subplots_adjust(right=0.80)
ax3.spines["right"].set_position(("axes"1.13))
# X軸のラベル(時分)
hoursfmt = mdates.DateFormatter("%H:%M")
ax1.xaxis.set_major_formatter(hoursfmt)
xlabels = ax1.get_xticklabels()
plt.setp(xlabels, rotation=45)
# Y軸のラベル(単位)
ax1.yaxis.set_label_coords(-0.0451.03)
ax2.yaxis.set_label_coords(1.071.09)
ax3.yaxis.set_label_coords(1.211.09)
ax1.set_ylabel("(℃)", fontproperties=fp, rotation=0)
ax2.set_ylabel("(%)", fontproperties=fp, rotation=0)
ax3.set_ylabel("(hPa)", fontproperties=fp, rotation=0)
# 凡例
fig.legend(["温度""湿度""気圧"], bbox_to_anchor=(00), bbox_transform=ax1.transAxes, loc="lower left", prop=fp)
#plt.xkcd()
pic_filename = PIC_DIR + date + PIC_NAME
plt.savefig(pic_filename)

11:49