Pythonで2軸グラフ表示 Matplotlib 〜X軸を2本してみた:twiny、そしてX軸もY軸も2本にしたけど失敗した話〜

スポンサーリンク

X軸を2本にする意味

前回、前々回とY軸が2本のグラフの作成方法を解説しました。

Pythonで2軸グラフ表示 Matplotlib 〜Y軸を2本にしてみる:twinx その 1〜
2軸グラフの表示前にpythonのグラフ操作ライブラリmatplotlibを使って、色々なグラフの表示を解説しました。今になって思ったのが2軸グラフというのをまだ紹介していなかったこと。2軸グラフがどんなグ...

今回はX軸が2本のグラフの作成方法を解説していきます。

Y軸が2本のグラフは2つのデータ間で値が大幅に違う際に分かりやすく表示するということで利用価値が分かります。

しかしX軸が2本というのはどういう時に使われるのでしょうか?

個人的にはX軸が単なる数値であれば、2軸にしてまで表示する必要はないと思います。

しかしX軸が文字だったり、日付だったりした場合、一つの軸では表示できません。

そんな時に使うのかなと思います。

ということで試していきましょう。

スポンサーリンク

X軸が2本のグラフの作成方法

まずはデータを準備します。

先ほど少しお話しした通り、X軸が2本の場合はX値は数値ではなく、文字のことが多いだろうということでx1は文字で1から10まで、x2はaからjまでをリストにしてみました。

Y値に関しては、y1は1から10まで増加させ、y2は逆は10から1まで減少させてみました。

x1 = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]
y1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
x2 = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]
y2 = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

このデータを表示させてみましょう。

前にY軸を2本にする際、用いたコマンドは「twinx()」でした。

ということはtwiny()にすればいいのではないかと推測されます。

from matplotlib import pyplot as plt

x1 = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]
y1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
x2 = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]
y2 = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

fig = plt.figure()

ay1 = fig.subplots()
ay2 = ay1.twiny()

ay1.plot(x1, y1)
ay2.plot(x2, y2)

plt.show()

実行結果

予想的中で、X軸が2本のグラフを表示することができました。

ちなみに線の色を変えたり、軸名の表示、フォントサイズなどは、X軸の場合と同じなので、解説は省略します。

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

一気に書くとこんな感じです。

from matplotlib import pyplot as plt

x1 = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]
y1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
x2 = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]
y2 = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

fig = plt.figure()

ay1 = fig.subplots()
ay2 = ay1.twiny()

ay1.plot(x1, y1, color="blue", label="x1")
ay2.plot(x2, y2, c="r", label="x2")

ay1.set_ylabel("y-axis", fontsize=15)
ay1.set_xlabel("x1-axis", fontsize=15)
ay2.set_xlabel("x2-axis", fontsize=15)

ay1.tick_params(labelsize=15)
ay2.tick_params(labelsize=15)

h1, l1 = ay1.get_legend_handles_labels()
h2, l2 = ay2.get_legend_handles_labels()
ay1.legend(h1 + h2, l1 + l2)

plt.show()

実行結果
スポンサーリンク

X軸もY軸も2本にしてみる-失敗編

これまでY軸を2本にする方法、X軸を2本にする方法を解説してきました。

ということはX軸、Y軸がそれぞれ2本にしたグラフもかけるのではないかと考えますよね。

試してみましょう。

一番試してみたくなるのが、2つ目のグラフを設定する際、2軸にするコマンド「twinx()」、「twiny()」を一気に指定する方法です。

つまりこんな感じ。

ax2 = ax1.twinx().twiny()

全体のコードとしてはこんな感じになります。

from matplotlib import pyplot as plt

x1 = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]
y1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
x2 = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]
y2 = [2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]

fig = plt.figure()

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

ax1.plot(x1, y1, color="blue", label="x1y1")
ax2.plot(x2, y2, c="r", label="x2y2")

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

plt.show()

実行結果

X軸もY軸も2本になり、一見成功したかの様に見えます。

それぞれX軸、Y軸の名前を追加し、さらに軸の数値のサイズを大きくしてみましょう。

現状ではax1、ax2のグラフがあるので、それぞれにset_xlabel、set_ylabel、tick_paramsを設定すれば良いと考えられます。

つまりこんな感じのコードを追加すればいいのではないでしょうか。

ax1.set_xlabel("x1-axis", fontsize=15)
ax1.set_ylabel("y1-axis", fontsize=15)
ax2.set_xlabel("x2-axis", fontsize=15)
ax2.set_ylabel("y2-axis", fontsize=15)

ax1.tick_params(labelsize=15)
ax2.tick_params(labelsize=15)

試してみましょう。

from matplotlib import pyplot as plt

x1 = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]
y1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
x2 = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]
y2 = [2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]

fig = plt.figure()

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

ax1.plot(x1, y1, color="blue", label="x1y1")
ax2.plot(x2, y2, c="r", label="x2y2")

ax1.set_xlabel("x1-axis", fontsize=15)
ax1.set_ylabel("y1-axis", fontsize=15)
ax2.set_xlabel("x2-axis", fontsize=15)
ax2.set_ylabel("y2-axis", fontsize=15)

ax1.tick_params(labelsize=15)
ax2.tick_params(labelsize=15)

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

plt.show()

実行結果

右側のY軸の名前が表示されていませんし、軸の数値のサイズも大きくなっていません。

つまりこの方法ではとりあえずは表示はできるものの、ある軸の操作ができなくなってしまうという問題があるようです。

せっかくなのでちゃんと表示させてみたいので、次回その方法を解説していきます。

Pythonで2軸グラフ表示 Matplotlib 〜X軸もY軸も2本のグラフを表示: twinx、twiny〜
X軸もY軸も2本にするためのグラフの作成方法前回、X軸を2本にする方法を解説し、さらにX軸もY軸も2本にしようとしたのですが、失敗しました。今回はX軸もY軸も2本にする方法を解説していきたいと思います。前回...

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

コメント

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