はじめに
[Python] 気象庁のサイトから気温のデータをダウンロードしてヒートマップ図を生成するで生成したヒートマップ図をMP4フォーマットの動画にしてみます。
開発環境
- Windows 10
- Python 3.10.5
前回のプログラム
[Python] 気象庁のサイトから気温のデータをダウンロードしてヒートマップ図を生成するのプログラムを下に示します。
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
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)
今回追加するプログラム
さらに下のプログラムを追加します。
import cv2
img = cv2.imread('heatmap.png')
print('shape of dot of file = ', img.shape[0], img.shape[1], img.shape[2])
size=(1920, 1080) # MP4のサイズ指定
format = cv2.VideoWriter_fourcc('m','p','4','v')
f = cv2.VideoWriter('HeatMap.mp4', format, 10.0, size)
pxl = 2132
decimationnum = 16
for i in range(0, img.shape[1]-pxl, decimationnum):
img_part = img[0 : img.shape[0], i: i+pxl]
img_part=cv2.resize(img_part,(1920, 1080))
##img_part=cv2.resize(img_part,(640, 480))
f.write(img_part)
f.release()
print('完了')
簡単に説明します。
print('shape of dot of file = ', img.shape[0], img.shape[1], img.shape[2])
ここでは生成されたヒートマップ図のドット数を確認しています。
pxl = 2132
decimationnum = 16
MP4ファイルの横幅のドット数を2132ドットに設定しています。また、1ドットずつ動かしてももちろんかまいませんが、少し遅い気がしたので16ドットごとに間引いて動かしてみました。
mp4ファイルを置きます。