matplotlib
前回、Pythonのmatplotlibで年表を描く時に便利な不等な間隔をもつ線分を描く方法を紹介しました。
今回はmatplotlibでお互いに関連づけられる単位をもつ2軸を作成する方法を紹介します。
どういうことかというと2軸目のメモリが1軸目と何らかの関係性がある、例えば1軸目がセンチメーターで2軸目がメートルなど、相互に変換可能な軸をもつ2軸グラフを描く方法ということです。
特に一般的にはメートル、センチメートルをはじめ、デシリットルとミリリットル、キロメートルとマイル、リットルと立法センチメートルなど相互に変換できる値がたくさんあります。
科学の世界で言えばもっと複雑で光子エネルギーのeVと波長(nm)や波数(cm-1)と波長(nm)、熱量の単位ジュール(J)とカロリー、摂氏温度(℃)と絶対温度(K)などがあります。
しかもどちらをメインで使っているかは、人によってだったり、時代によってだったり、分野によってだったりで変わってきます。
そんな時にどちらの単位も書いてあると自分にとっても、そのグラフを見る人にとっても、分かりやすいグラフになると思い、ちょっとやってみたというのが今回のきっかけ。
それでは始めていきましょう。
secondary_xaxis、secondary_yaxisで2軸目を作成
まず「plt.gca().secondary_xaxis(“位置”)」、もしくは「plt.gca().secondary_yaxis(“位置”)」を使い、2軸目を作成します。
位置には「top」、「right」、「bottom」、「left」を入力します。
ただし1軸目のX軸が下に、Y軸が左にすでにあるので、2軸目のX軸の場合は「top」、Y軸の場合は「right」を設定します。
import matplotlib.pyplot as plt
fig = plt.figure()
plt.clf()
plt.gca().secondary_xaxis("top")
plt.show()
実行結果
import matplotlib.pyplot as plt
fig = plt.figure()
plt.clf()
plt.gca().secondary_yaxis("right")
plt.show()
実行結果
1軸目と2軸目の単位を関連づける方法
次に1軸目と2軸目の単位を関連づけていきます。
最初はX軸の1軸目(下)にセンチメートルを、2軸目(上)にメートルを設定して見ます。
最初にお互いを変換するための関数を作成します。
メートルとセンチメートルの場合はこんな感じです。
def meter2cm(x):
return x*100
def cm2meter(x):
return x/100
「meter2cm関数」では引数に与えられたメートル単位の値に100を掛けてセンチメートルに変換して返します。
「cm2meter関数」では引数に与えられたセンチメートル単位の値を100で割ってメートルに変換して返します。
次に先ほど学んだ「secondary_xaxis(“位置”)」のオプションにさらに「functions=(2軸目の関数, 1軸目の関数)」を追加します。
そして今回は「ax1 = fig.subplots()」でサブプロットを作成した後に「ax2 = ax1.secondary_xaxis(“top”, functions=(2軸目の関数, 1軸目の関数))」で2軸目を作成します。
import matplotlib.pyplot as plt
x = range(0, 1000)
y = [x_val*2 for x_val in x]
def meter2cm(x):
return x*100
def cm2meter(x):
return x/100
fig = plt.figure(figsize=(10,6))
plt.clf()
ax1 = fig.subplots()
ax1.plot(x, y)
ax1.set_xlabel("cm")
ax2 = ax1.secondary_xaxis("top", functions=(cm2meter, meter2cm))
ax2.set_xlabel("meter")
plt.show()
実行結果
これでお互い関連づけられる単位をもつ2軸を作成することができました。
他の例1:波数(cm-1)と波長(nm)
波数と波長はお互い\(\frac{1}{x}\times 10 ^ 7\) で関連づけることができます。
import matplotlib.pyplot as plt
x = range(4000, 10000)
y = [x_val*2 for x_val in x]
def wavelength2kayser(x):
return 1/x * 10**7
def kayser2wavelength(x):
return 1/x * 10**7
fig = plt.figure(figsize=(10,6))
plt.clf()
ax1 = fig.subplots()
ax1.plot(x, y)
ax1.set_xlabel("cm-1")
ax2 = ax1.secondary_xaxis("top", functions=(kayser2wavelength, wavelength2kayser))
ax2.set_xlabel("wavelength(nm)")
plt.show()
実行結果
例2:光子エネルギー(eV)と波長(nm)
光子エネルギー(eV)と波長(nm)はお互い\(\frac{1240}{x}\)で関連づけることができます。
import matplotlib.pyplot as plt
x = range(1000, 2500)
y = [x_val*2 for x_val in x]
def wavelength2eV(x):
return 1240/x
def eV2wavelength(x):
return 1240/x
fig = plt.figure(figsize=(10,6))
plt.clf()
ax1 = fig.subplots()
ax1.plot(x, y)
ax1.set_xlabel("wavelength(nm)")
ax2 = ax1.secondary_xaxis("top", functions=(wavelength2eV, eV2wavelength))
ax2.set_xlabel("eV")
plt.show()
実行結果
次回はmatplotlibでX軸を上に、Y軸を右に表示する方法を紹介します。
ではでは今回はこんな感じで。
コメント