2

次のような状況があります: 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は左軸の目盛りです。

4

1 に答える 1

0

FuncFormatter を試してみてください:


from matplotlib.ticker import FuncFormatter

...

def ticks2(y, pos):
    return '%1.1e' % exp(y)

xvals = arange(0,4,0.1)
ax1.plot(xvals, exp(xvals), '-')
ax2.set_ylim(ax1.get_ylim())
ax2.yaxis.set_major_formatter(FuncFormatter(ticks2))

plt.show()

行で、多かれ少なかれコールバックをバイパスすることに注意してくださいax2.set_ylim(ax1.get_ylim())。上記は大したことではないように見えますが、ティック番号の間隔がそれほど良くないという欠点があります (これを試してみるとわかります)。

もう一度言いますが、あなたが 2 番目の y 軸に何をプロットしようとしているのか、また、このように表示することが本当に役立つかどうかを把握しようとしています (時間とエネルギーが言及されているので、エネルギーは指数関数です時間はエネルギーとともに指数関数的に増加しますか?)。しかし、それは別の質問です。

于 2012-07-27T14:51:25.653 に答える