背景
ふとしたきっかけで急に日本全国の雨温図を自作してみたくなったので、Pythonを使って各県庁所在地の雨温図を作ってみました。
作ったもの
今回は、以下のようなExcelファイルと雨温図を作ります。
- Excelファイル
- 雨温図
環境
- Windows 10
- Python 3.9.1
- pandas 1.24
- matplotlib 3.4.1
- numpy 1.19.3
作成手順
データの取得
気象庁が過去の気象データを公開しているので、そこから気象データをダウンロードします。
今回は、以下の検索条件を指定しました。
-
地点
- 各都道府県の県庁所在地
-
項目
- 月平均気温
- 降水量の月合計
- 「過去の平均値との比較オプション」の**「平均値も表示」**
-
期間
- 連続した期間で表示(2020年1月 ~ 2020年12月)
(指定する年度は任意)
- 連続した期間で表示(2020年1月 ~ 2020年12月)
-
表示オプション
- 利用上注意が必要なデータの扱い
→ 値を表示(格納)しない。 - 観測環境などの変化の前後で、値が不均質となったデータの扱い
→観測環境などの変化前の値を表示(格納)しない。 - ダウンロードCSVファイルのデータ仕様
→データ表示画面と同様に、数値以外の記号を含む
- 利用上注意が必要なデータの扱い
表示オプションは設定しなくても構いませんが、設定しておくと後のデータの整理が楽になります。
気象データの整理
csvの読み込み
import pandas as pd
df = pd.read_csv("ダウンロードしたcsvファイルのパス", header = 1, index_col = 0, encoding="cp932")
そのまま読み込むと文字化けしてしまったので、この記事1を参考にencoding="cp932"
を指定しました。
必要な部分の抽出
length = len(df.columns)
df = df.iloc[:, 1:length:2] # 1行飛ばしで抽出
df = df[2:14]
今回作成する雨温図には各項目の過去の平均値を用いることにします。
過去の平均値は1列飛ばしとなっているので、[:, 1:length:2]
として抽出しています。
また、上から2行の情報はいらないので必要な行のみを抽出します。
型の変換
df = df.astype("float")
最初に格納されている数値のデータ型はstr
型です。このままだとこの後うまくグラフを作ることができないのでデータ型をfloat
に変換しておきます。
Excelファイルへの書き出し
it = iter(df.columns.tolist())
with pd.ExcelWriter("weathers.xlsx") as writer:
for i, j in zip(it, it):
sheet_name = i.replace(".1", "")
df_new = df[[i, j]]
df_new.columns = ["平均気温", "降水量"]
df_new.index = ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"]
df_new.to_excel(writer, index=True, sheet_name=sheet_name)
各県庁所在地の「平均気温」と「降水量」を、それぞれ個別に各県庁所在地名のシートにしてExcelファイルに出力しています。
データフレームから連続する二つの列を抽出する方法については、この記事2を参考にしました。
各県庁所在地名は取得した最初の列名から.1
を取り除くことにより取得しています。
また、後からわかりやすいようにに列名と行名を変更しています。
雨温図の作成
Excelファイルの読み取り
dfs = pd.read_excel("weathers.xlsx", sheet_name=None)
先ほど作成したExcelファイルを読み込みます。
複数シートの読み込みについてはこの記事3を参考にしました。
このときdfs
は、シート名(ここでは「県庁所在地」)がキーkey
、シートのデータ(ここでは「平均気温」と「降水量」)が値value
となる辞書dict
となっています。
雨温図の作成
import matplotlib.pyplot as plt
import japanize_matplotlib
import numpy as np
city_code = 1
for item in dfs.items():
city_name = item[0]
df = item[1]
df = df.rename(columns={"Unnamed: 0": "月"})
# 各グラフの色を指定
color_temperature = "orangered"
color_waterfall = "deepskyblue"
# グラフ描画領域を作成
fig,ax1=plt.subplots(figsize=(5,8))
ax2=plt.twinx(ax1)
# グラフを描画
plt.title(city_name)
ax1.plot(df["月"], df["平均気温"], zorder=100, color=color_temperature, label="平均気温", alpha= 1)
ax2.bar(df["月"], df["降水量"], zorder=1, color=color_waterfall, label="降水量", edgecolor='#333', linewidth=1, alpha = 0.5, width=1)
ax1.set_ylabel("気温(℃)")
ax2.set_ylabel("降水量(mm)")
ax1.set_yticks(np.array(range(-10, 41, 10)))
ax2.set_yticks(np.array(range(0, 501, 100)))
ax1.grid(which = "major", axis = "y", color = "gray", alpha = 0.5, linewidth = 1)
ax1.set_axisbelow(True)
handler1, label1 = ax1.get_legend_handles_labels()
handler2, label2 = ax2.get_legend_handles_labels()
# 凡例をまとめて出力
ax1.legend(
handler1 + handler2,
label1 + label2,
loc="upper right",
borderaxespad=0,
)
plt.savefig(f"./{city_code}_{city_name}.png")
city_code += 1
雨温図を作成します。このグラフの作成の大部分はこの記事4を参考にしました。
おまけ
せっかく雨温図を作ったので、地域ごとに雨温図を見てみましょう。
北海道
太平洋側
日本海側
中央高地
瀬戸内
南西諸島
おわりに
雨温図を自作することによって、地域ごとの気候の特徴がより分かりやすくなったと思います。ここまで読んでくださった方も、この記事によって少しでも地域ごとの気候に興味を持っていただけら幸いです。