Pythonで2軸グラフ表示 Matplotlib 〜Y軸を2本にしてみる:twinx その 1〜

スポンサーリンク

2軸グラフの表示

前にpythonのグラフ操作ライブラリmatplotlibを使って、色々なグラフの表示を解説しました。

Pythonでグラフ表示 matplotlib 〜折れ線グラフ、マジックコマンド、表示範囲の制限〜
グラフ描写ライブラリmatplotlibとは?これまで文字や数字をどうやって扱うかを解説してきました。そろそろ文字や数字だけの出力は飽きてきたのではないでしょうか?やっぱり数字を扱い始めたら、やりたくなるのが、グラ...

今になって思ったのが2軸グラフというのをまだ紹介していなかったこと。

2軸グラフがどんなグラフかというとこんなグラフです。

一つのXの値に対して、二つのYデータがあるとき、左右に違う軸を使って表示します。

ちなみにこの2軸グラフは温度・湿度ロガーのデータを表示した際にも紹介しています。

Pythonで温度・湿度ロガー IBS-TH1 PLUSのデータを分析してみる その6:グラフの表示
前回のおさらい:データの変換と格納前回は温度・湿度ロガーのデータを分析するため、CSVファイルを読み込み、データをグラフ表示できる形に変換、そしてリストへ格納しました。まずはここまでのおさらいです。まずはフ...

その際はあくまでも温度・湿度ロガーのデータ解析がメインだったので、せっかくならちゃんと2軸グラフの作り方を解説しておこうというのが今回の趣旨です。

スポンサーリンク

まずは準備と1軸グラフではダメな理由

ということで始めていきましょう。

pythonでグラフを表示する際に使用するライブラリは「matplotlib」 で、その中の「pyplot」モジュールを使用します。

まずはmatplotlibのpyplotをインポートします。

from matplotlib import pyplot as plt

「as plt」とすることで「pyplot」と書かなくても「plt」と書くことで「pyplot」と書いたのと同じことができる様になります。

つまり省略形ということです。

このmatplotlibのpyplotは慣例的に「plt」とするので、ここでもその様に省略形を用いましょう。

次にデータを決めます。

今回はなるべく単純に、だけど2軸にする意味があるデータとしましょう。

x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y1 = [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
y2 = [2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]

xは単に1から10までの数字を並べてみました。

yの値は二ついるので、y1、y2として、y1は2ずつ増加するリストに、y2は倍々になっていくリストにしてみました。

これを単純にグラフ表示してみるとこんな感じになります。

from matplotlib import pyplot as plt

x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y1 = [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
y2 = [2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]

fig = plt.figure()

plt.plot(x, y1)
plt.plot(x, y2)

plt.show()

実行結果

これではy2の変化が大きいため、グラフの縦軸の数値が大きくなりすぎてしまい、y1の変化が見えなくなってしまっています。

2軸グラフとするとこのy1の変化も分かりやすく表示することができます。

スポンサーリンク

2軸グラフを表示してみよう

2軸グラフを表示するにはこんな感じのプログラムになります。

fig = plt.figure()

ax1 = fig.subplots()
ax2 = ax1.twinx()

ax1.plot(x, y1)
ax2.plot(x, y2)

plt.show()

まずは「ax1 = fig.subplots()」で第一軸(左側のy軸)を作ります。

この時に使うsubplotsとは、複数の別のグラフを表示する際に用いるコマンドです。

subplotsに関してはまた今後、詳細を解説していきたいと思います。

今回は2軸を表示する際にはこうするんだなと思ってもらえれば大丈夫です。

第二軸(右側のy軸)を作るのが次の「ax2 = ax1.twinx()」です。

nxという名前だと「ax1. twinx()」だと、ax1に対して異なるX軸をもつもう一つのグラフを作り出すと考えてしまうかもしれませんが、名前の由来は実は違います。

Matplotlibの公式ページを見てみるとこう書いてあります。

Create a twin Axes sharing the xaxis

https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.axes.Axes.twinx.html

つまりX軸が共通で、もう一つのY軸を作り出すというのが名前の由来のようです。

とりあえずこうして1つのX軸を共通にもつ2つのY軸のグラフができました。

そしてそれぞれのグラフ(ax1、ax2)にデータをプロットします。

ax1.plot(x, y1)
ax2.plot(x, y2)

そしてplt.show()で表示するというわけです。

全体を書いてみるとこんな感じになります。

from matplotlib import pyplot as plt

x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y1 = [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
y2 = [2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]

fig = plt.figure()

ax1 = fig.subplots()
ax2 = ax1.twinx()

ax1.plot(x, y1)
ax2.plot(x, y2)

plt.show()

実行結果

確かに2本グラフが表示され、y1もy2の変化量が大幅に違うのにちゃんと変化しているグラフが得られました。

ここで気になるのは、最初のグラフではそれぞれの線が異なる色で書かれていました。

しかし2軸グラフでは同じ色で書かれています。

これは最初のグラフ(Y軸が1軸のグラフ)では一つのグラフに対して2つのデータが表示されているため、1つ目のデータ、2つ目のデータと認識され、自動で色分けしてくれています。

それに対し、最後のグラフ(Y軸が2軸のグラフ)では、二つのグラフを用意して、それぞれに一つずつグラフを表示させているため、どちらも1番目のデータと認識されてしまっています。

そのため、1番目のデータを表示する薄い青を使ってグラフを表示しているのです。

ということでグラフの色を変える方法を解説していきます。

スポンサーリンク

グラフの線の色を変える方法

実はグラフの線の色や太さを変える方法は前に解説しています。

Pythonでグラフ表示 matplotlib 〜線の太さ、色、点線〜
線の太さを変更する前回、折れ線グラフの全体の見栄えを調整する方法を解説しました。今度は線自体を色々変更して、見やすいグラフにしてみましょう。まずは前回のおさらいです。%matplotlib note...

これは2軸グラフになっても有効で、データをプロットするコマンドで、「color=”色の名前”」か「c=”色の名前”」とすると色を変えることができます。

ax1.plot(x, y1, color="blue")
ax2.plot(x, y2, c="r")

全体のコードはこうなります。

from matplotlib import pyplot as plt

x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y1 = [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
y2 = [2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]

fig = plt.figure()

ax1 = fig.subplots()
ax2 = ax1.twinx()

ax1.plot(x, y1, color="blue")
ax2.plot(x, y2, c="r")

plt.show()

実行結果

色が変わりました。

この様に線の色を変えるだけでなく、太さや点線にするなどは普通のグラフのコマンドが使えますので、前の解説ページを参考にしてみてください。

Pythonでグラフ表示 matplotlib 〜線の太さ、色、点線〜
線の太さを変更する前回、折れ線グラフの全体の見栄えを調整する方法を解説しました。今度は線自体を色々変更して、見やすいグラフにしてみましょう。まずは前回のおさらいです。%matplotlib note...
スポンサーリンク

凡例を表示する方法

ただし、凡例を表示する方法だけはちょっと工夫が必要です。

普通のグラフに対しての凡例の表示の仕方はこちらのページで解説しています。

Pythonでグラフ表示 matplotlib 〜タイトル、軸名、凡例の表示〜
タイトルを表示する前回、matplotlibを使って、グラフを表示する方法を解説しました。グラフは表示できたのですが、何とも味気ないグラフになっていましたよね。やはりグラフを表示したら、タイトルやX軸、Y軸...

plotの中に「label=”凡例名”」を追加することでそれぞれのデータの名前を指定し、別の行にplt.legent()とすることで表示するということです。

2軸グラフで同じことを試してみましょう。

from matplotlib import pyplot as plt

x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y1 = [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
y2 = [2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]

fig = plt.figure()

ax1 = fig.subplots()
ax2 = ax1.twinx()

ax1.plot(x, y1, color="blue", label="a")
ax2.plot(x, y2, c="r", label="b")
plt.legend()

plt.show()

実行結果

二つ目のグラフ(y2)の凡例は表示されましたが、一つ目のグラフ(y1)の凡例は見当たりません。

これは二つの凡例がかぶってしまっているためで、それを修正するためにこちらのコマンドが必要になります。

h1, l1 = ax1.get_legend_handles_labels()
h2, l2 = ax2.get_legend_handles_labels()
ax1.legend(h1 + h2, l1 + l2)

これを追加してグラフを表示してみましょう。

from matplotlib import pyplot as plt

x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y1 = [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
y2 = [2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]

fig = plt.figure()

ax1 = fig.subplots()
ax2 = ax1.twinx()

ax1.plot(x, y1, color="blue", label="a")
ax2.plot(x, y2, c="r", label="b")

h1, l1 = ax1.get_legend_handles_labels()
h2, l2 = ax2.get_legend_handles_labels()
ax1.legend(h1 + h2, l1 + l2)

plt.show()

実行結果

ちなみに凡例のサイズや位置は通常と同じ様に変更できますので、こちらの記事を参考にしてみてください。

Pythonでグラフ表示 matplotlib 〜タイトル、軸名、凡例の表示〜
タイトルを表示する前回、matplotlibを使って、グラフを表示する方法を解説しました。グラフは表示できたのですが、何とも味気ないグラフになっていましたよね。やはりグラフを表示したら、タイトルやX軸、Y軸...

多分、それぞれの凡例の相対的な位置をずらして表示していると思うのですが、正直よく分かりません。

とりあえず上のコマンドで2軸グラフの凡例は表示できるということで勘弁してください。

今回はとりあえず2軸グラフの基本を解説しました。

次回はもう少し全体の見栄えを変えていく方法を解説していきたいと思います。

Pythonで2軸グラフ表示 Matplotlib 〜Y軸を2本にしてみる:twinx その 2〜
Y軸が2本のグラフ前回は2軸グラフとしてY軸が2本のグラフを表示する基本を解説しました。前回の最後のプログラムとしてはこんな感じ。from matplotlib import pyplot as plt...

ということで今回はこんな感じで。

コメント

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