はじめに
気象庁は全国各地の温度や湿度、降水量などのデータを保存しており、ダウンロードをすることができます。今回東京の気温のデータをダウンロードして、ヒートマップ図を生成してみようと思います。
開発環境
- Windows 10
- Python 3.10.5
気象庁のサイトから気温のデータをダウンロードする
気象庁の下のリンクを開いて、CSVデータをダウンロードします。
https://www.data.jma.go.jp/gmd/risk/obsdl/
今回は東京の時別値の気温データを選んでダウンロードしました。そして最初の文字の部分を削除して、以下のCSVファイルを対象としました。
ヒートマップ図のためにCSVデータを並べ替える
いろいろなやり方があると思いますが、ここでは上のdata.csvのデータをヒートマップ図を生成するために並べ替えてみます。
import numpy as np
import pandas as pd
import csv
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
length = len(pd.read_csv('data.csv', header=None))
print ('length = ', length)
with open('data.csv', 'r', newline="") as f:
reader = csv.reader(f)
i = 0
lst = []
for row in reader:
#lst = []
datetime = row[0]
sspace = datetime.split(' ')
date = sspace[0] # 日付け
print('date = ', date)
temperature = row[1] # 気温
print('temperature = ', temperature)
if (i<24):
lst.append(temperature)
print ('lst = ', lst)
if (i==23):
df = pd.Series(lst, index=['0:00', '1:00', '2:00', '3:00', '4:00', '5:00', '6:00', '7:00', '8:00', '9:00', '10:00', '11:00', '12:00', '13:00', '14:00', '15:00', '16:00', '17:00', '18:00', '19:00', '20:00', '21:00', '22:00', '23:00'], name=date)
print ('df = ', df)
df.to_csv('f.csv')
lst = []
print ('lst = ', lst)
else:
lst.append(temperature)
print ('lst = ', lst)
if ((i+1)%24==0):
df_followed = pd.Series(lst, index=['0:00', '1:00', '2:00', '3:00', '4:00', '5:00', '6:00', '7:00', '8:00', '9:00', '10:00', '11:00', '12:00', '13:00', '14:00', '15:00', '16:00', '17:00', '18:00', '19:00', '20:00', '21:00', '22:00', '23:00'], name=date)
print ('df_followed = ', df_followed)
df = pd.concat([df, df_followed], axis=1)
print ('df = ', df)
lst = []
print ('lst = ', lst)
if ((i+1)==length):
df.to_csv('heatmapdata.csv')
i += 1
最初にread_csvとlenを使用して、ファイルのデータ数を調べます。
次にpandasのSeriesデータ構造にし、インデックスとして0:00から23:00をアサインします。ヘッダーは年月日をアサインします。そしてconcatを使用して列を接続していきます。
heatmap.csvとして保存します。
ヒートマップ図を生成する
ヒートマップ図を生成する部分を下に示します。
df = pd.read_csv('heatmapdata.csv', index_col=0)
print('df = ', df)
columnlength = len(df.columns)
print ('columnlength =', columnlength)
maxvallist = []
minvallist = []
for j in range(1, columnlength, 1):
maxval = df[df.keys()[j]].max()
minval = df[df.keys()[j]].min()
maxvallist.append(maxval)
minvallist.append(minval)
maxvalue = max(maxvallist)
minvalue = min(minvallist)
print('maxvalue = ', maxvalue)
print('minvalue = ', minvalue)
fig, ax = plt.subplots(figsize=(32.0, 4.0))
sns.heatmap(df, vmin=minvalue, vmax=maxvalue, cmap='jet', ax=ax)
ax.set_title('気温のヒートマップ図', loc='left', fontsize=30, fontname="Meiryo")
ax.set_xlabel('年月日', fontname="Meiryo")
ax.set_ylabel('時刻', fontname="Meiryo")
ax.invert_yaxis()
ax.grid(True)
fig.tight_layout()
fig.savefig('heatmap.png', dpi=300)
ヒートマップ図を生成するために、seabornライブラリを使用します。
気温の最大値と最小値を検索し、それぞれをseabornの最大値と最小値にアサインします。カラーパレットはかなりたくさん種類があり、ここではjetというカラーパレットを指定します。
ラベル名は日本語を使用しているため、set_title、set_xlabelとset_ylabelのそれぞれに、fontname="Meiryo"を指定しています。何も指定しないと文字化けをしてしまいます。
生成されたヒートマップ図を下に示します。
1年を通して夏は暑く冬は寒く、また夜間に比べて日中の方が気温が高いことが一目瞭然でわかります。全体の傾向がわかり易いことがヒートマップ図の長所だと思います。