次のような状況があります: 2 つの y 軸を持つプロットがあります。左の軸は対数スケールで、数量を示していますy(x)
。x
は x 軸上で線形です。2 番目のy
軸には、1 番目の軸にプロットされている値と同じ値の自然対数スケールを追加したいと考えています。y
最初の軸に次の目盛りがあるとします。
10^0 10^1 10^2
次に、2 番目のy
軸では、
exp(10^0) exp(10^1) exp(10^2)
この例のコードを使用して、2 番目の軸の制限を正しく設定することができました。ただし、スケールが対数とは異なるため、その間の値が間違った方法で配置されます。exp(10^2)
は非常に大きいため、 と の目盛りはexp(10^1)
軸exp(10^0)
の下部で互いに非常に接近していますが、10^1
は最初の y 軸のちょうど真ん中にあります。
カスタムスケールを使用できると考えましたが、例は非常に複雑で、これを行う簡単な方法があるのではないかと考えました. そうでない場合でも、目盛りに自分で手動でラベルを付けることができますが、これは非常に汚い解決策です。
例:
#!/usr/bin/python2
from numpy import arange, exp
import matplotlib.pyplot as plt
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax2 = plt.twinx()
ax1.set_yscale("log")
ax2.set_yscale("log")
ax1.grid(True)
# the conversion
def time(energy):
return exp(energy)
# the callback to adjust the limits
def update_ax2(ax1):
y1, y2 = ax1.get_ylim()
ax2.set_ylim(time(y1), time(y2))
ax2.figure.canvas.draw()
ax1.callbacks.connect("ylim_changed", update_ax2)
# plot some function
xvals = arange(0,4,0.1)
ax1.plot(xvals, exp(xvals), '-')
plt.show()
結果の画像は次のようになります。
ご覧のとおり、軸の上限と下限は左右のスケールで一致していますが、右の軸ではスケーリングが異なるため、中間点は一致していません。写真に必要な目盛りを手動で配置することになりましたが、この問題の簡単な解決策があればいいのにと思います。変換関数はちょうどexp(y)
で、y
は左軸の目盛りです。