フォト
サイト内検索
ココログ最強検索 by 暴想
2026年6月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30        
無料ブログはココログ

最近のトラックバック

にほんブログ村

  • にほんブログ村

« GrovePi+の温湿度センサーから得たCSVファイルをmatplotlibでグラフ化(その2) | トップページ | カルロス・ゴーンが11月19日に捕まった »

2018年12月 1日 (土)

GrovePi+の温湿度センサーから得たCSVファイルをmatplotlibでグラフ化(その3)

 今回は、「その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時間前としています。なにか、もっと良い方法もあるように思えますがとりあえずこの方法を採用しています。

Temp26
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()

« GrovePi+の温湿度センサーから得たCSVファイルをmatplotlibでグラフ化(その2) | トップページ | カルロス・ゴーンが11月19日に捕まった »

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

« GrovePi+の温湿度センサーから得たCSVファイルをmatplotlibでグラフ化(その2) | トップページ | カルロス・ゴーンが11月19日に捕まった »