複数のデータを単一のグラフで表現しようとした場合,データの絶対値の違いから,一方のデータの特徴が意図したとおりに描画できない場合があります。
赤線は一見直線のように見えるが実際にはCos波である
そこで,matplotlib を用いて以下のような2軸グラフでデータを表現することで,データの特徴を可視化していきます。本ページでは2軸グラフの描画方法について簡単にまとめています。
matplotlibで描画した2軸グラフ。絶対値の異なる2データの対応関係がうまく描画されている。
(本ページにて紹介しているコードはgithubにて公開しています。)
DataAnalOji.hatena.sample/python_samples/blog_plot_2-axis_graph.ipynb at master · Data-Anal-Ojisan/DataAnalOji.hatena.sample
samples for my own blog. Contribute to Data-Anal-Ojisan/DataAnalOji.hatena.sample development by creating an account on GitHub.
パッケージのインポート
数値処理用のパッケージとして numpy, グラフ描画用のパッケージとして matplotlib をインポート。
import numpy as np
%matplotlib inline
import matplotlib.pyplot as plt
サンプルデータの作成
振幅の異なる2つの波をサンプルデータとして作成。
# サンプルデータの生成
N = np.arange(0, 10, 0.01)
Sin = np.sin(N * np.pi) # Sin波
Cos = np.cos(N * np.pi) / 200 # Cos波(振幅=1/200)
1軸グラフを描画
1軸グラフを描画するコードは以下の通りです。
なお,本ページではオブジェクト指向で matplotlib のコードを記述しています。
# 各線グラフの色を指定
color1 = "b"
color2 = "r"
# グラフ描画領域を作成
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
# 線グラフを描画
ax.plot(Sin, color=color1, label="Sin") # Sin波の描画
ax.plot(Cos, color=color2, label="Cos") # Cos波の描画
ax.legend(loc="upper right") # 凡例の追加(描画位置を右上に指定)
plt.show() # グラフを描画
2軸グラフを描画
twinx() を利用し,最初に作成した描画領域とx軸を共有する,2つ目の描画領域を作成することで2軸グラフを描画します。
また,2軸グラフを描画する際には,線グラフの描画色とy軸の描画色を一致させることで可読性が向上します。
# グラフ描画領域を作成
fig = plt.figure()
ax1 = fig.add_subplot(1, 1, 1) # 1つ目の描画領域
ax2 = ax1.twinx() # 1つ目の描画領域とx軸を共有する描画領域を作成
# 線グラフを描画
ax1.plot(Sin, color=color1, label="Sin")
ax2.plot(Cos, color=color2, label="Cos")
# 各描画領域の凡例の情報を取得
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,
)
# y軸の色を変更
ax2.spines["left"].set_color(color1)
ax2.spines["right"].set_color(color2)
# y軸の値の色を変更
ax1.tick_params(axis="y", colors=color1)
ax2.tick_params(axis="y", colors=color2)
# 軸ラベルを設定
ax1.set_ylabel("sin")
ax2.set_ylabel("cos")
plt.show() # グラフを描画
補足:サブプロットを利用した描画
サブプロット利用し,異なる描画領域に対しでグラフを描画することでも絶対値の異なるデータを可視化できます。
# グラフ描画領域を作成
fig = plt.figure()
ax1 = fig.add_subplot(2, 1, 1) # 1つ目の描画領域
ax2 = fig.add_subplot(2, 1, 2) # 2つ目の描画領域
# 線グラフを描画
ax1.plot(Sin, color=color1, label="Sin") # Sin波の描画
ax2.plot(Cos, color=color2, label="Cos") # Cos波の描画
ax1.legend(loc="upper right") # 1つ目の描画領域に凡例を追加
ax2.legend(loc="upper right") # 2つ目の描画領域に凡例を追加
plt.show() # グラフを描画
サブプロットを利用した描画例
コメント