X軸を2本にする意味
前回、前々回とY軸が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軸の場合と同じなので、解説は省略します。

一気に書くとこんな感じです。
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軸の名前が表示されていませんし、軸の数値のサイズも大きくなっていません。
つまりこの方法ではとりあえずは表示はできるものの、ある軸の操作ができなくなってしまうという問題があるようです。
せっかくなのでちゃんと表示させてみたいので、次回その方法を解説していきます。

ということで今回はこんな感じで。
コメント