【Matplotlib】Y軸を2つや3つに増やして凡例を付ける方法 (twinx)

複数のY軸を一つのグラフに統合し、データの複雑な関係性を見るための方法がわからないと感じていませんか?また、グラフに凡例を加える方法も分からないかもしれません。

この記事では,twinxを使用してMatplotlibで複数のY軸をグラフに追加する方法をわかりやすく解説します

さらに,plot関数とscatter関数の2つで,それぞれ凡例を付け方が異なるため,詳しく解説しています

読み終えた後、Matplotlibのtwinxをマスターして、一つのグラフで複数のY軸を効果的に使用できるようになります。また、凡例の追加方法も理解し、クリアな可視化スキルとデータ分析力が向上します

目次

複数のy軸を持つ折れ線グラフ

Matplotlibで軸を増やすには,Axes.twinx関数を使います

凡例を付けるには,legendの引数のhandlesにplot関数で作成したオブジェクトを使います

Axes.twinx

2つのy軸を持つ折れ線グラフ

Axes.twinx関数でy軸を1つ追加して,折れ線グラフを2つ描画します

下記のタブにコードとフローチャートの解説をしています

plot関数で作成したオブジェクトを変数に置き換えるときに,カンマがあります

import matplotlib.pyplot as plt
import numpy as np

# step1 グラフフレームの作成
fig, ax = plt.subplots()

# step2 y軸の作成
twin1 = ax.twinx()

# step3 折れ線グラフの描画
p1, = ax.plot([0, 1, 2], [0, 1, 2], 'C0', label='Y1')
p2, = twin1.plot([0, 1, 2], [0, 3, 2], 'C1', label='Y2')

ax.set_xlabel('X label')
ax.set_ylabel('Y1')
twin1.set_ylabel('Y2')
ax.set_title('line graph with 2 y-axes')

# step4 凡例の追加
ax.legend(handles=[p1, p2])

plt.show()

3つのy軸を持つ折れ線グラフ

Axes.twinx関数でy軸を2つ追加して,折れ線グラフを3つ描画します

グラフの右側を0.25だけ空けて,3つ目の軸の位置を0.2だけ右側にしました

plot関数で作成したオブジェクトを変数に置き換えるときに,カンマがあります

# step1 グラフフレームの作成
fig, ax = plt.subplots()
fig.subplots_adjust(right=0.75)

# step2 y軸の作成
twin1 = ax.twinx()
twin2 = ax.twinx()
# twin2を右方向に動かします
twin2.spines['right'].set_position(('axes', 1.2))

# step3 折れ線グラフの描画
p1, = ax.plot([0, 1, 2], [0, 1, 2], 'C0', label='Y1')
p2, = twin1.plot([0, 1, 2], [0, 3, 2], 'C1', label='Y2')
p3, = twin2.plot([0, 1, 2], [50, 30, 15], 'C2', label='Y3')

# step4 凡例の追加
ax.legend(handles=[p1, p2, p3], loc='center left')

plt.show()

複数のy軸を持つ散布図

Axes.twinx関数を用いて,散布図でも軸を増やすことができます

2つのy軸を持つ散布図

Axes.twinx関数でy軸を1つ追加して,散布図を2つ描画します

下記のタブにコードとフローチャートの解説をしています

# step1 グラフフレームの作成
fig, ax = plt.subplots()

# step2 y軸の作成
twin1 = ax.twinx()

# step3 散布図の描画
p1 = ax.scatter([0, 0.4, 0.8, 1, 1.3, 1.8, 2], [0, 8, 2, 1, 21, 14, 22], c='C0', label='Y1')
p2 = twin1.scatter([0, 0.7, 0.9, 1, 1.2, 1.5, 2], [0, 34, 23, 23, 12, 8, 16], c='C1', label='Y2')

ax.set_xlabel('X label')
ax.set_ylabel('Y1')
twin1.set_ylabel('Y2')
ax.set_title('scatter graph with 2 y-axes')

# step4 凡例の追加
ax.legend(handles=[p1, p2])

plt.show()

3つのy軸を持つ散布図

Axes.twinx関数でy軸を2つ追加して,散布図を3つ描画します

グラフの右側を0.25だけ空けて,3つ目の軸の位置を0.2だけ右側にしました

# step1 グラフフレームの作成
fig, ax = plt.subplots()
fig.subplots_adjust(right=0.75)

# step2 y軸の作成
twin1 = ax.twinx()
twin2 = ax.twinx()
# twin2を右方向に動かします
twin2.spines['right'].set_position(('axes', 1.2))

# step3 散布図の描画
p1 = ax.scatter([0, 0.4, 0.8, 1, 1.3, 1.8, 2], [0, 8, 2, 1, 21, 14, 22], c='C0', label='Y1')
p2 = twin1.scatter([0, 0.7, 0.9, 1, 1.2, 1.5, 2], [0, 34, 23, 23, 12, 8, 16], c='C1', label='Y2')
p3 = twin2.scatter([0, 0.6, 0.8, 1, 1.4, 1.8, 2], [22, 50, 23, 24, 95, 30, 15], c='C2', label='Y3')

# step4 凡例の追加
ax.legend(handles=[p1, p2, p3])

plt.show()

3つのy軸と軸ラベルの色を指定

MatplotlibのAxes.twinx関数で作成した各軸の色を指定し,より分かりやすいグラフを作成します

変更する箇所は,3つのy軸,y軸ラベル,折れ線グラフです

# ax.legend(handles=[p1, p2, p3]の下に追加
# 軸ラベルの色
ax.yaxis.label.set_color(p1.get_color())
twin1.yaxis.label.set_color(p2.get_color())
twin2.yaxis.label.set_color(p3.get_color())
# 軸の数値の色
ax.tick_params(axis='y', colors=p1.get_color())
twin1.tick_params(axis='y', colors=p2.get_color())
twin2.tick_params(axis='y', colors=p3.get_color())

plt.show()

参考文献

複数の軸を持つグラフ

お疲れ様でした

シェアしてくださると嬉しいです!
  • URLをコピーしました!

コメント

コメントする

目次