アメグラ2号のブログ

1980年代後半の古き良きビデオゲームのほか、オッサンの個人的備忘録

python(pandas, matplot) DBからグラフに書き出す その2

f:id:game-allergy:20210331143049p:plain

前回matplotでグラフに書き出しをしたが、1つのグラフを出すより、2つのグラフを並べて比較する…ってのが現実的な使い方だと思う。
ということで、当日の天気と、翌日の天気情報を比較できるグラフを作成してみる。

◆グラフを2つ表示する

#===============================
# DB内テーブル中身の確認(pandas)
# matplotでグラフ書き出し
# 複数グラフ作成
#===============================
"""
DBのテーブルには72時間分(72個)のデータが並んでいる。
当日、翌日、翌々日のうち、
「当日、翌日」を比較するグラフを作成する
"""

import sqlite3
import pandas as pd
import matplotlib.pyplot as plt

#-----------------------------
# DB接続、カーソル起動
#-----------------------------
dbname = 'TEST.db'
connection = sqlite3.connect(dbname)
cur = connection.cursor()
#-----------------------------
# データを2種類、DBから引き出す
#-----------------------------
# 0-24時までのデータ(data1)
sql1 = 'SELECT temp, hour FROM WeatherTable LIMIT 24'
c1 =cur.execute(sql1)
result1 = c1.fetchall()
#print(result1)

# 次の日の0-24時までのデータ(data2)
sql2 = 'SELECT temp, hour FROM WeatherTable LIMIT 24,24'
c2 = cur.execute(sql2)
result2 = c2.fetchall()
#print(result2)

#-----------------------------
# DataFrameにする
#-----------------------------
#データフレーム(表に書き出すイメージ)
df1 = pd.DataFrame(result1,columns=["temp", "hour"])
df2 = pd.DataFrame(result2,columns=["temp", "hour"])

#-----------------------------
# グラフの準備(2つのグラフ)
#-----------------------------
# グラフのX軸、Y軸の指定
x1 = df1.hour
y1 = df1.temp
x2 = df2.hour
y2 = df2.temp

# 表示エリアの設定
# fig内にchart1,chart2が横並びする形式にする
# まずは、figのオブジェクト生成
fig = plt.figure()

# グラフ上限値を決めておく(5℃~25℃)
tempMin = 5
tempMax = 25

# (data1)----------------------------
# add_subplot(行、列、場所)
chart1 = fig.add_subplot(1,2,1)
# データプロット
chart1.plot(x1, y1)
# Y軸の最小、最大値を取得
#ymin, ymax = plt.ylim()
plt.ylim(tempMin, tempMax)
# グラフ内のラベル表記
chart1.set_title("Today")
chart1.set_xlabel("Time")
chart1.set_ylabel("Temperature(℃)")
# (data2)----------------------------
# add_subplot(行、列、場所)
chart2 = fig.add_subplot(1,2,2)
# データプロット
chart2.plot(x2, y2)
# data1で取得したY軸情報をdata2に設定(同じにする)
#plt.ylim(ymin, ymax)
plt.ylim(tempMin, tempMax)
# グラフ内のラベル表記
chart2.set_title("Tomorrow")
chart2.set_xlabel("Time")
chart2.set_ylabel("Temperature(℃)")

#-----------------------------
# グラフの表示
#-----------------------------
fig.tight_layout() 
plt.show()

#==================
# ディスプレイにデータ表示
#==================
# ディスプレイ表示省略しない
pd.set_option("display.max_colwidth", None)
pd.set_option("display.max_rows", None)

# ディスプレイに表示
print(df1)
print(df2)
#==================
#DB終了処理
#==================
cur.close()
connection.close()

print('--------------------')
print('end of line')
input()

スクリプト概要

取得した情報が72時間分=72個のデータで、これをどうやって当日、翌日にわけようかと…そうしないと2つのグラフにならないし。とりあえずSQLで出す時点で条件分けて2つのデータを抽出することにしてみた。その後、各データfetchall()で全読みしたものをリストに。そのリストをデータフレームにしてグラフ化しやすい状態に。データフレームのオブジェクトにした後はx軸にhour、y軸にtempと割り当てればグラフ化できる、こりゃ簡単だ。

ちょっとハマったのはグラフを2つにする箇所。グラフ2つを1つの表示エリアに出す…には、plt.figure()でオブジェクトを作成しておくところ、ここがキモだ。これが出来上がれば後はこの中にグラフ2つ、chart1,chart2を設定していけばいい。

2つのグラフの最大値がバラバラになってしまう問題は、plt.ylim(**,**)で直打ちした。。。最初作成したグラフから最小値、最大値を取得して次のグラフに値をセットする方法もあったけど、見たい領域が決まっているなら自分で指定したほうが早い。今の季節なら5℃~25℃くらいでいいでしょってことで。

◆実行結果

f:id:game-allergy:20210414164131j:plain

当日の気温の変化、翌日の気温の変化、を視覚的に確認できる。

ええ?今日の最高気温は22.5℃くらいなのに、明日は17.5℃??しかも今日の夜中から10℃切るって???4月の半ばだというのにまだまだ寒い。

f:id:game-allergy:20210414164200j:plain

◆気になったので湿度も取得してみた

f:id:game-allergy:20210414221421j:plain f:id:game-allergy:20210414221321j:plain

TVの天気予報を見ていたら明日は乾燥してカラッカラだって。え?そーなの?そうか、温度の変化と一緒に湿度の変化があったほうが環境の変化を掴みやすい。温度が低くて湿度が低い→人体には良くない…とか直感的に把握しやすくなる。

というか、明日ってこんなに湿度が低下しちゃうの???今日はさんざん雨降ってジメジメだったのに明日は20%くらい?
こりゃ明日は洗濯日和だね。