Pythonで2軸グラフ表示 Matplotlib その3:2軸グラフでX軸、Y軸の範囲を指定する方法: set_xlim、set_ylim

スポンサーリンク

X軸、Y軸の範囲を指定

前にX軸、Y軸それぞれ、もしくはともに2本の2軸グラフの作成方法を解説しました。

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

そこで忘れていたこと。

それは2軸グラフの場合、どうやってそれぞれの軸での表示範囲の指定するのかということです。

拡大は前に解説したマジックコマンドを使うとマウスを使って動的に範囲を指定し拡大することができます。

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

しかしマウスで範囲を指定するとなると、正確な範囲を指定したり、複数のグラフで全く同じ範囲のグラフを作成するのは困難です。

通常の1軸グラフであれば、xlim(a, b)、やylim(a, b) で表示範囲を指定することができます(aは最小値、bは最大値)。

では2軸グラフになった場合はどの様に範囲を指定するのでしょうか?

ということで今回は2軸グラフの場合のX軸、Y軸の範囲の指定方法を解説していきます。

スポンサーリンク

前回のおさらい

まずは前回のプログラムのおさらいをしてみましょう。

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.twiny()
ax3 = ax2.twinx()

ax1.plot(x1, y1, color="blue", label="x1y1")
ax3.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)
ax3.set_ylabel("y2-axis", fontsize=15)

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

h1, l1 = ax1.get_legend_handles_labels()
h3, l3 = ax3.get_legend_handles_labels()
ax1.legend(h1 + h3, l1 + l3)

plt.show()

実行結果

データのXはx1、x2の2つ、またYはy1、y2の2つ。

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]

そして、データはax1にx1とy1の組み合わせで、ax3にx2、y2の組み合わせでプロットされています。

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

このプロットしているグラフを意識して、表示範囲を制限していきます。

スポンサーリンク

set_xlim、set_ylim

2軸グラフでX軸の表示範囲を指定する場合はset_xlim(最小値, 最大値)とします。

またY軸の表示範囲を指定する場合は、set_ylim(最小値, 最大値)とします。

とりあえずこんな感じで指定してみます。

ax1.set_xlim(2,5)
ax1.set_ylim(3,7)

プログラム全体はこんな感じ。

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.twiny()
ax3 = ax2.twinx()

ax1.plot(x1, y1, color="blue", label="x1y1")
ax3.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)
ax3.set_ylabel("y2-axis", fontsize=15)

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

ax1.set_xlim(2,5)
ax1.set_ylim(3,7)

h1, l1 = ax1.get_legend_handles_labels()
h3, l3 = ax3.get_legend_handles_labels()
ax1.legend(h1 + h3, l1 + l3)

plt.show()

実行結果

表示範囲が制限されましたが、X軸の範囲を(2, 5)と指定したのに、3から6になっています。

これはx1のリストの数字がint型ではなく、str型となっているため、インデックスとして2である”3″からインデックスとして5である”6″までの範囲となってしまっています。

(リストを指定するインデックスは0, 1, 2…というように0から始まります)

x1のリストをint型としての数字に変えてみましょう。

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.twiny()
ax3 = ax2.twinx()

ax1.plot(x1, y1, color="blue", label="x1y1")
ax3.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)
ax3.set_ylabel("y2-axis", fontsize=15)

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

ax1.set_xlim(2,5)
ax1.set_ylim(3,7)

h1, l1 = ax1.get_legend_handles_labels()
h3, l3 = ax3.get_legend_handles_labels()
ax1.legend(h1 + h3, l1 + l3)

plt.show()

実行結果

今度はX軸の表示範囲が2から5の範囲になりました。

このset_xlim、set_ylimをもう一つのグラフであるax3で行うとax3のグラフの範囲を指定できます。

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.twiny()
ax3 = ax2.twinx()

ax1.plot(x1, y1, color="blue", label="x1y1")
ax3.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)
ax3.set_ylabel("y2-axis", fontsize=15)

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

ax1.set_xlim(2,5)
ax1.set_ylim(3,7)

ax3.set_xlim(1,3)
ax3.set_ylim(0,10)

h1, l1 = ax1.get_legend_handles_labels()
h3, l3 = ax3.get_legend_handles_labels()
ax1.legend(h1 + h3, l1 + l3)

plt.show()

実行結果

2軸目も表示範囲をしていできました。

スポンサーリンク

前に使ったxlim、ylimは使えないのか?

普通のグラフの場合、X軸、Y軸の表示範囲を指定するのにxlim(最小値, 最大値)、ylim(最小値, 最大値)を使いました。

2軸グラフではこのコマンドは使えないのでしょうか?

試してみましょう。

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.twiny()
ax3 = ax2.twinx()

ax1.plot(x1, y1, color="blue", label="x1y1")
ax3.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)
ax3.set_ylabel("y2-axis", fontsize=15)

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

ax1.xlim(2,5)

h1, l1 = ax1.get_legend_handles_labels()
h3, l3 = ax3.get_legend_handles_labels()
ax1.legend(h1 + h3, l1 + l3)

plt.show()

実行結果
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-16-daaa90cdc6e5> in <module>
     24 ax3.tick_params(labelsize=15)
     25 
---> 26 ax1.xlim(2,5)
     27 
     28 h1, l1 = ax1.get_legend_handles_labels()

AttributeError: 'AxesSubplot' object has no attribute 'xlim'

やっぱりダメでした。

今回は2軸グラフでX軸、Y軸の表示範囲を変える方法を解説しました。

綺麗なグラフを作成するには必須のコマンドなので、是非とも覚えておきたいものです。

次回は複数のグラフに対して、それぞれのX軸、Y軸の表示範囲を変える方法を解説していきます。

Pythonで複数のグラフを一括表示 Matplotlib その4:subplots、subplotでのX軸、Y軸の表示範囲指定: xlim、set_xlim、ylim、set_ylim
複数のグラフを一括表示した場合のX軸、Y軸の表示範囲指定前にsubplots、もしくはsubplotを使って複数のグラフを一括表示する方法を解説しました。今回はこの複数のグラフそれぞれのX軸、Y軸の表示範囲...

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

コメント

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