Matplotlib Python データサイエンス

【Python/Matplotlib】2軸グラフの作成方法を解説


今回はMatplotlibを用いた2軸グラフの作成方法をコード例とともに解説します。

本記事を読めばMatplotlibを用いた分かりやすい2軸グラフを作れるようになりますので是非最後まで読んでいってください。

脳みそ男

一つのグラフに情報を複数表示したいけど、どうすればいいか分からない。



複数グラフの表示だとどうしても見づらくなる。。。

脳筋太郎




本記事ではそんな疑問にお答えします。

こんな方におすすめの記事

  • Matplotlibで同じx軸に複数の情報を載せたい
  • 軸ごとに色分けして分かりやすく2軸グラフを表示したい
  • グラフのマーカー、色、ラインスタイルの使い方を知りたい


本記事のコードはGitHubにて公開中!




2軸グラフの作成方法 【Matplotlib】 


まず本記事で作成する2軸のグラフ完成例を見てみましょう。

今回はKaggleにて国連の提供する温室効果ガス排出量データのうち日本のCO2(二酸化炭素)およびCH4(メタン)の排出量を一つのグラフに示しています。


同じ時間軸の中にCO2の排出量とCH4の排出量の2軸が記載されており、かつそれぞれの軸ごとに色分けがなされているため、見やすいグラフになっていますね!

グラフを作成するときは常に見る人が直感的にわかるようなデザインを心がけましょう!

それでは、次項からこれらのグラフの作成手法に関して詳しく見ていきます。


脳みそ男

見やすいグラフって本当に大事!


解析用時系列データの読み込み 【pd.read_csv】


それではまず解析用の時系列データを読み込みます!

今回はKaggleにて提供されている国連の提供する温室効果ガス排出量データを使用しました。





このデータでは1990年から2017年にかけての各国温室効果ガスの排出量が記載されています。

このデータのうち、今回は日本国内のCO2とCH4の2つの排出量を可視化することを目指します。

まずはじめにデータに何があるのかを確認してみましょう!


入力

# 必要なライブラリの読み込み
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import os

#使用データセット入手先 -> https://www.kaggle.com/unitednations/international-greenhouse-gas-emissions
#国連提供 温室効果ガスデータセット 1990-2017

#データの読み込み 保存先、ファイル名は要修正
directory = ["../Data"]
file = ["greenhouse_gas_inventory_data.csv"]
df = pd.read_csv(os.path.join(directory[0], file[0]))
Column_List = df.columns

print('--------------------------------------------------')
print('df_shape: (%i,%i)' % df.shape)
print('--------------------------------------------------')

df.head()

出力

8406行、4列のデータがあることが分かります。

カラムにはそれぞれ国、年度、排出量、排出ガスの種別が記載されているようですね、ふむふむ。

今回は日本のCO2/CH4に絞って確認したいので、次にPandasを用いて必要な情報のみにフィルタリングしていきましょう!



最終的にグラフを作るには年度をx軸、排出量をy軸に取ればよさそうだね!

脳筋太郎


必要なデータのフィルタリング 【pandas.unique】


次にPandasの条件フィルタリングで日本国内のCO2/CH4の情報のみにフィルタリングします!

この際に排出ガスの種別の文言が長いので

pandas.unique

メソッドでCO2とCH4の種別をリストから選択するようにしています。


入力

#今回使用するCO2とCH4のcategoryがどれになるかを確認
category_name = df["category"].unique()

#日本のCO2排出量でフィルタリング
df_co2 = df[(df["category"] == category_name[0]) & (df["country_or_area"] == "Japan")]

#CH4排出量でフィルタリング
df_ch4 = df[(df["category"] == category_name[4]) & (df["country_or_area"] == "Japan")]

print(df_co2.info())
print(df_ch4.info())

出力

<class 'pandas.core.frame.DataFrame'>
Int64Index: 25 entries, 500 to 524
Data columns (total 4 columns):
 #   Column           Non-Null Count  Dtype  
---  ------           --------------  -----  
 0   country_or_area  25 non-null     object 
 1   year             25 non-null     int64  
 2   value            25 non-null     float64
 3   category         25 non-null     object 
dtypes: float64(1), int64(1), object(2)
memory usage: 1000.0+ bytes
None
<class 'pandas.core.frame.DataFrame'>
Int64Index: 25 entries, 4572 to 4596
Data columns (total 4 columns):
 #   Column           Non-Null Count  Dtype  
---  ------           --------------  -----  
 0   country_or_area  25 non-null     object 
 1   year             25 non-null     int64  
 2   value            25 non-null     float64
 3   category         25 non-null     object 
dtypes: float64(1), int64(1), object(2)
memory usage: 1000.0+ bytes
None

日本のCO2排出量をdf_co2のデータフレーム、CH4の排出量をdf_ch4のデータフレームに出力できました!

それぞれ1990-2015年までの排出量が記録されているようですね!



脳みそ男

フリーで使えるデータを知っておくと便利だね!


時系列データの表示 【plt.subplots】


それではmatplotlibの

matplotlib.pyplot.subplots

メソッドで軸およびグラフ表示エリアを指定し、可視化を行っていきます。

まずはCO2のみ可視化してみましょう。x軸は時間なのでカラム"year"を選択、y軸には排出量"value"を選択します。

データフレームはもちろん先ほど作ったdf_co2を使いましょう!


入力

#時系列データの表示

#plot用の箱を作成
fig, ax = plt.subplots()

#x軸に時間、y軸にco2の排出量を記載
ax.plot(df_co2["year"], df_co2["value"])
plt.show()

出力


可視化できましたね!ただ少し味気ない、、

せっかくなので見やすくするためにマーカーと線色、ラインスタイルを変更してみましょう!

matplotlibで指定できるマーカー、色、ラインスタイルは以下で確認できるので、参考にしてください!



入力

#label/markerの追加

#plot用の箱を作成
fig, ax = plt.subplots()

#x軸に時間、y軸にco2の排出量を記載
ax.plot(df_co2["year"], df_co2["value"], marker ="o", linestyle = "--", color ="r")
plt.show()

出力

段違いでかっこよくなりましたね!

いろいろマーカーの種類等も変えてみて自分のお気に入りのデザインに仕上げましょう!


マーカーが入るだけでも格段に見やすいね!

脳筋太郎


2軸グラフの作成 【Axes.twinx】


それでは最後に今回の目的である2軸グラフを作成していきます!

まずは同じy軸にCO2の排出量とCH4の排出量を2つ入れ込んで可視化してみましょう。

入力

#同じグラフに2軸示す

#plot用の箱を作成
fig, ax = plt.subplots()

#x軸に時間、y軸にco2の排出量を記載
#CO2排出量
ax.plot(df_co2["year"], df_co2["value"], marker ="o", linestyle = "--", color ="r")
#メタン排出量
ax.plot(df_ch4["year"], df_ch4["value"], marker ="x", linestyle = "-", color ="b")
plt.show()

出力


CO2の排出量に比較してCH4の排出量は小さいため、それぞれの排出量が全く分かりません、、、

これでは意味のないグラフになってしまいます。

そこでy軸をもう一つ増やす方法が以下のメソッドです!

matplotlib.axes.Axes.twinx

このax.twinxを用いることでy軸をもう一つ増やすことができます。

左側にCO2排出量、右側にCH4排出量の軸を増やして可視化してみましょう!

ついでに、軸の表記も見やすくするために

matplotlib.axes.Axes.tick_params

メソッドでグラフの色に合わせて色を変更していきます。


入力

#同じグラフに2軸示す

#plot用の箱を作成
fig, ax = plt.subplots()
ax2 = ax.twinx()

#x軸に時間、y軸にco2の排出量を記載
#CO2排出量
ax.plot(df_co2["year"], df_co2["value"], marker ="o", linestyle = "--", color ="r")
ax.set_xlabel('Time')
ax.set_ylabel('CO2 Emission', color='r')
ax.tick_params('y', colors="r")

#メタン排出量
ax2.plot(df_ch4["year"], df_ch4["value"], marker ="x", linestyle = "-", color ="b")
ax2.set_ylabel('CH4 Emission', color='b')
ax2.tick_params('y', colors="b")
plt.show()

出力

2軸にした上、CO2排出量、CH4排出量でそれぞれ色分けされて見やすくなりましたね!

めでたしめでたし。



脳みそ男

色分けするだけで直感的にどれがどれだか分かる!!


まとめ


本日はmatplotlibを用いた2軸グラフの作成方法について解説しました。

複数のグラフを作ってもよいのですが、対比を見たいときなどには一つのグラフ内に記載してしまうのが良いかと思います!

是非参考にしてデータ解析に励んでください。


もっと詳しくmatplotlibの使い方を勉強したいと思ったそこのアナタ!pythonを用いたコーディング学習にはData Campがおススメです!

詳細に関してはこちらで紹介しています。↓

こちらもぜひ参考にしてください。


それでは本日は以上でした!



-Matplotlib, Python, データサイエンス