【Python】生成したヒートマップ図をMP4フォーマットの動画にする

はじめに

[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ファイルを置きます。

© 2025 サニーサイド