2016-02-15 11 views
8

私は、範囲が10^-3から10^+3になるログログプロットを持っています。値<10^0が指数部に-の符号を持つ方法と同様に値≥10^0に指数部の+サインを付けることを希望します。 matplotlibでこれを行う簡単な方法はありますか?matplotlib軸の指数に+記号を追加する

私はFuncFormatterを調べましたが、これを達成するにはあまりにも複雑で、動作させることができませんでした。

私はこれがあなたが何を意味するかであると思います
+0

そのようなx軸とy軸の目盛りの注釈を書式設定することを意味しますか? – tokamak

+0

@tokamak - 実際にはy軸だけに興味がありますが、両方の軸を個別に設定するとよいでしょう – nluigi

+0

目盛りを生成するコードを見るhttps://github.com/matplotlib/matplotlib/blob/ 7d1a7c2e4637efba239ad3b984928c0175d45f98/lib/matplotlib/ticker.py#L803自分で変更する明白な方法がないようです。私は非最適な方法は、変更ラインの変更版を作成することになると思います。 –

答えて

5

。ダックの値が1より大きいか小さいかの条件が必要です。log10(tick value)>0の場合は、ラベル文字列に+記号を追加します。そうでない場合は、マイナス記号が自動的に取得されます。

import matplotlib.pyplot as plt 
import matplotlib.ticker as ticker 
import numpy as np 

# sample data 
x = y = np.logspace(-3,3) 

# create a figure 
fig,ax = plt.subplots(1) 

# plot sample data 
ax.loglog(x,y) 

# this is the function the FuncFormatter will use 
def mylogfmt(x,pos): 
    logx = np.log10(x) # to get the exponent 
    if logx < 0: 
     # negative sign is added automatically 
     return u"$10^{{{:.0f}}}$".format(logx) 
    else: 
     # we need to explicitly add the positive sign 
     return u"$10^{{+{:.0f}}}$".format(logx) 

# Define the formatter 
formatter = ticker.FuncFormatter(mylogfmt) 

# Set the major_formatter on x and/or y axes here 
ax.xaxis.set_major_formatter(formatter) 
ax.yaxis.set_major_formatter(formatter) 

plt.show() 

enter image description here

フォーマット文字列のいくつかの説明:

"$10^{{+{:.0f}}}$".format(logx) 

重括弧{{}}を指数として提起しなければならない、その中にすべてのものを意味し、LaTeXに渡されます。単一の中括弧は、フォーマット文字列を格納するためにpythonで使用されるため、二重の括弧が必要です。この場合は{:.0f}です。書式指定の詳細については、docs hereを参照してください。ただし、TL; DRでは小数点以下の桁数が0の浮動小数点数をフォーマットしています(つまり、本質的に整数として表示しています)。 np.log10がfloatを返すため、指数はこの場合はfloatです。 (代わりに、np.log10の出力をintに変換してから、文字列をintとしてフォーマットすることができます。好みの好みのものを使用してください)。

+0

Ok thx、私はこれと一緒に行くつもりです。' {{:.0f}}の形式を説明できますか? '私は過剰な角括弧はエスケープするために使われますが、正確には ':.0f'は何をしますか? – nluigi

0

def fmt(y, pos): 
    a, b = '{:.2e}'.format(y).split('e') 
    b = int(b) 
    if b >= 0: 
     format_example = r'$10^{+{}}$'.format(b) 
    else: 
     format_example = r'$10^{{}}$'.format(b) 
    return 

その後FuncFormatterを使用して、例えばカラーバーの場合:plt.colorbar(name_of_plot,ticks=list_with_tick_locations, format = ticker.FuncFormatter(fmt))。あなたはimport matplotlib.ticker as tickerを輸入しなければならないと思います。あなたはmatplotlib.tickerモジュールからFuncFormatterでこれを行うことができます

よろしく

関連する問題