Pythonを使った2軸グラフの作成 その3 Matplotlib 入門講座 09_03

Python
この記事は約9分で読めます。

Pythonを使った2軸グラフの作成方法

気温と湿度の2軸グラフ

前回までの記事はこちら

Pythonを使った2軸グラフの作成 Matplotlib 入門講座 09_01

Pythonを使った2軸グラフの作成 その2 Matplotlib 入門講座 09_02

今回の講義ではサンプルデータが必要です。
kino-codeさんのホームページにデータがあります。
Matplotlib-Seaborn09-1month_data.csv
Matplotlib-Seaborn09-kion_data.csv

まずはライブラリをインポート。

そしてkino-codeさんで予め用意されていたデータを読み込みます。
今回もGooglecolaboを使用していますので、
同じフォルダーにデータをアップロードしてマウントして使用します。

引数index colで、Dateの列をインデックスに指定します。

import matplotlib.pyplot as plt
%matplotlib inline
import pandas as pd

from google.colab import drive
drive.mount('/content/drive')

data = pd.read_csv('/*****/*****/*****/*****/Matplotlib-Seaborn09-kion_data.csv', index_col='Date', parse_dates=True)
kion_data.head()

まずはそれぞれの項目を変数に代入します。

date = kion_data.index
temp = kion_data['気温(℃)']
humid = kion_data['湿度(%)']

気温、湿度、それぞれでグラフを描いてみます。

気温と湿度を2軸でプロット

subplotsfigureオブジェクトとaxisオブジェクトを作成します。
ax1には気温のtempをプロット。
区別するためにカラーはコーラルとしておきます。
ax2にはtwinxを記述し、第2軸にする設定をします。
こちらには、湿度のhumidをプロットします。

fig, ax1 = plt.subplots(figsize=(9,6))

ax1.plot(temp, color='coral')

ax2 = ax1.twinx()
ax2.plot(humid)

plt.show()

湿度のy軸を0-100、気温0-20に設定します。
それそれset_ylimの引数に入力します。

fig, ax1 = plt.subplots(figsize=(9,6))

ax1.plot(temp, color='coral')
ax1.set_ylim(0,20)

ax2 = ax1.twinx()
ax2.plot(humid)
ax2.set_ylim(0,100)

plt.show()

軸ラベル、タイトル追加して、よりグラフを見やすいようにグリッドも
表示させます。

fig, ax1 = plt.subplots(figsize=(9,6))

ax1.plot(temp, color='coral')
ax1.set_ylim(0,20)
ax1.set_ylabel('気温[℃]', fontsize=14)
ax1.grid(axis='y')

ax2 = ax1.twinx()
ax2.plot(humid)
ax2.set_ylim(0,100)
ax2.set_ylabel('湿度[%]', fontsize=14)

plt.title('Tokyo Temperature/Humid', fontsize=16)

plt.show()

x軸の時間表記を変更します。
axis setメソッドの、major formatterを使用します。
()の中には、dt.DateFormatter('%H:%M')と記述します。
HはhourMはminuteの頭文字です。
この記述は、ax1とax2のどちらに記述をしても同じように表示されます

fig, ax1 = plt.subplots(figsize=(9,6))

ax1.plot(temp, color='coral')
ax1.set_ylim(0,20)
ax1.set_ylabel('気温[℃]', fontsize=14)

ax2 = ax1.twinx()
ax2.plot(humid)
ax2.set_ylim(0,100)
ax2.set_ylabel('湿度[%]', fontsize=14)
ax2.xaxis.set_major_formatter(dt.DateFormatter('%H:%M'))

plt.title('Tokyo Temperature/Humid', fontsize=16)
plt.grid()
plt.show()

それぞれのグラフに凡例を追加しましょう。
plotメソッドの()の中に引数labelを記述し、
凡例に表示させたい名前をシングルコーテーションでくくります。

次に、ax1とax2のそれぞれでlegendを作成し、()の中で凡例の設定をします。
何も設定しないデフォルトでは、2つの凡例が重なってしまうので、
引数locbbox to anchorで互いの凡例の位置をずらす設定をします。

x1.legend(bbox_to_anchor=(1, 1), loc='upper right', frameon=False, fontsize=14)
ax2.legend(bbox_to_anchor=(1, 0.9), borderaxespad=0, frameon=False, fontsize=14)

fig, ax1 = plt.subplots(figsize=(9,6))

ax1.plot(temp,color='coral', label='temp')
ax1.set_ylim(0,20)
ax1.set_ylabel('気温[℃]', fontsize=14)

ax2 = ax1.twinx()
ax2.plot(humid, label='humid')
ax2.set_ylim(0,100)
ax2.set_ylabel('湿度[%]', fontsize=14)
ax2.xaxis.set_major_formatter(dt.DateFormatter('%H:%M'))

ax1.legend(bbox_to_anchor=(1, 1), loc='upper right', frameon=False, fontsize=14)
ax2.legend(bbox_to_anchor=(1, 0.9), borderaxespad=0, frameon=False, fontsize=14)

plt.title('Tokyo Temperature/Humid', fontsize=16)
plt.grid()
plt.show()

y軸の目盛りに補助目盛りを追加します。
matplotlibのtickerというライブラリからMultipleLocatorをインポートします。
from matplotlib.ticker import MultipleLocator

axis setメソッドのminor locatorを使って、補助目盛りの設定をします。
ax1.yaxis.set_minor_locator(MultipleLocator(0.5))
ax2.yaxis.set_minor_locator(MultipleLocator(5))

from matplotlib.ticker import MultipleLocator

fig, ax1 = plt.subplots(figsize=(9,6))

ax1.plot(temp,color='coral', label='temp')
ax1.set_ylim(0,20)
ax1.set_ylabel('気温[℃]', fontsize=14)

ax2 = ax1.twinx()
ax2.plot(humid, label='humid')
ax2.set_ylim(0,100)
ax2.set_ylabel('湿度[%]', fontsize=14)
ax2.xaxis.set_major_formatter(dt.DateFormatter('%H:%M'))

ax1.legend(bbox_to_anchor=(1, 1), loc='upper right', frameon=False, fontsize=14)
ax2.legend(bbox_to_anchor=(1, 0.9), borderaxespad=0, frameon=False, fontsize=14)

ax1.yaxis.set_minor_locator(MultipleLocator(0.5))
ax2.yaxis.set_minor_locator(MultipleLocator(5))

plt.title('Tokyo Temperature/Humid', fontsize=16)
plt.grid()
plt.show()

今回もkinocodeさんの動画で勉強させていただきました。
ありがとうございました!

コメント

タイトルとURLをコピーしました