今回は、「その3」としてCSVファイルからのグラフ化でも最右側が最新の数値になるようにしたので記述してみたいと思います。「
その1」の24時間グラフから変わった点は横軸(X軸)が月日/時刻表示になっていることです。
一番苦労したのは、CSVファイルの日時を日付型に変換することでした。なぜか、utf-8でCSVファイルに保存されているはずなのにASCIIで保存されていることに気がつかなかったことです。このため、CSVファイルをpythonの各変数に転写する際に日付型にならず、一旦文字列として変数に転写し、変数となったASCIIをさらにutf-8に変換し、それから更に日付型に変換しています。これでようやくグラフ化できます。CSVファイルを作成の時にはencoding='utf-8'と指定してあるにもかかわらずなぜか出来ていないのです。「Qiita>
[Python3] Shift_JISとUTF-8とASCIIを行き来する」によりASCIIからUTF-8に変換する方法.decode()を使っています。それから、「Qiita>
Python日付型」を参考にして文字列UTF-8から日付型に変換しています。
グラフ化については、横軸(X軸)の範囲を決めるのにチョット知恵を要しました。それは、日付型を入力したpri[1][]の最後値をどうやって求めるかでした。結局、日付型変換をした際に利用したxが使えることを考えてグラフの一番右側は変数pri[1][x-1]としてグラフの一番左側はそこから24時間前としています。なにか、もっと良い方法もあるように思えますがとりあえずこの方法を採用しています。
24時間グラフ(横軸月日時刻表示)
「temp02.csv」 をグラフ化
前提条件ですがRaspberryPi2でPython3、matplotlib2.0.0です。
以下ソースコードです。
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import sys
import math
import datetime
from matplotlib.font_manager import FontProperties#日本語化に必要
# matplotlib日本語化
font_path = '/usr/share/fonts/truetype/vlgothic/VL-Gothic-Regular.ttf'
font_prop = FontProperties(fname=font_path)
plt.rcParams['font.family'] = font_prop.get_name()
def main():
reader = np.loadtxt('temp02.csv',delimiter=',',skiprows=1, dtype=[('col1', 'i'), ('col2', 'S26'), ('col3', 'f4'), ('col4', 'f4'), ('col5', 'f8')])# CSVファイル読み込み
pri=list(map(list, zip(*reader)))#転置行列
#日時が記されている2行目の文字列をASCIIからutf-8に変換し、その後、文字列から日付型に変換
x=0
print(pri[1][0])#確認用
for memo in pri[1]:
henkan=memo.decode()#文字列をASCIIからutf-8に変換
pri[1][x]=datetime.datetime.strptime(henkan,'%Y-%m-%d %H:%M:%S.%f')#文字列から日付型に変換(小数点以下あり)
x=x+1
print(pri[1][x-1])#確認用
#グラフ下地
fig, host = plt.subplots(figsize=(19,5))#横長グラフにする
fig.subplots_adjust(left=0.05,right=0.93,bottom=0.15)#X軸の長さ、Y軸の長さ
# グラフ表示設定
host.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d\n%H:%M')) #X軸の月日時の表示
par1 = host.twinx()
par2 = host.twinx()
par2.spines["right"].set_position(("axes", 1.04))#右に3番めY軸目盛を作成
p1, = host.plot(pri[1], pri[2], 'r-',label="気温[℃]") # Y軸更新
p1.set_ydata(pri[2])
p2, = par1.plot(pri[1], pri[3], 'b-',label="湿度[%]") # Y軸更新
p2.set_ydata(pri[3])
p3, = par2.plot(pri[1], pri[4], 'g-',label="水蒸気量[$g/m^3$]") # Y軸更新
p3.set_ydata(pri[4])
host.set_xlim([pri[1][x-1] - datetime.timedelta(hours=24), pri[1][x-1]]) # X軸の範囲指定
host.set_ylim(10, 25)#Y1軸の範囲指定
par1.set_ylim(0, 100)#Y2軸の範囲指定
par2.set_ylim(0, 25)#Y3軸の範囲指定
plt.title("気温 湿度、水蒸気量[$g/m^3$]")
host.set_xlabel("日時")
host.set_ylabel("気温 [℃]")
par1.set_ylabel("湿度[%]")
par2.set_ylabel("水蒸気量[$g/m^3$]")
tkw = dict(size=4, width=1.5)#目盛の大きさと太さ
host.yaxis.label.set_color(p1.get_color())#Y1軸ラベルの文字色
par1.yaxis.label.set_color(p2.get_color())#Y2軸ラベルの文字色
par2.yaxis.label.set_color(p3.get_color())#Y3軸ラベルの文字色
lines = [p1, p2, p3]
host.legend(lines, [l.get_label() for l in lines])#凡例
plt.grid()#グラフ補助線の記載
plt.savefig("temp02.png",format = 'png', dpi=300)#高解像度画像保存
plt.show()
if __name__ == '__main__':
main()
最近のコメント