2017-04-05 4 views
1

私は輪郭のインラインラベルを持つ輪郭プロットをしています。ラベルは可能な限り簡潔でなければなりません。これまでのところ、私は使用しています:できるだけ簡潔になるように輪郭ラベルに使用するMatplotlibフォーマット指定子はどれですか?

のようにラベルにつながる
import matplotlib.pyplot as plt 
CS = plt.contour(dat, [2e6, 5e8, 8e11], norm = LogNorm(vmin=cutoff)) 
plt.clabel(CS, fontsize=9, inline=1, fmt="%.0g") 

2E-06、私はには先行ゼロがあってはならないと思います5E + 08 8E + 11

指数が正の場合、つまり上の例は次のようになるはずです。つまり、上の例は次のようになります:

2e-6 5e8 2e11

これを達成するために使用できるフォーマット指定子またはフォーマッタ関数は何ですか?

答えて

3

コンターラベル(clabels)を希望どおりにフォーマットするには、fmtの引数としてフォーマッタインスタンスを使用することができます。あなたはclabelsが少し大きくなっているので、実際に必要とされるものに対応していなくてもよい。ここ

enter image description here

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

x = np.linspace(-6,7, 100) 
X,Y = np.meshgrid(x,x) 
dat = np.exp(-(X-2)**2-(Y-2)**2)* 15e12 

cutoff = 1e6 
CS = plt.contour(dat, [2e6, 5e8, 8e11], norm = matplotlib.colors.LogNorm(vmin=cutoff)) 
fmt = matplotlib.ticker.LogFormatterSciNotation() 
fmt.create_dummy_axis() 
plt.clabel(CS, fontsize=9, inline=1, fmt=fmt) 

plt.show() 

を与えるLogFormatterSciNotationを、使用することができ、うまく探してラベルを持つように例えば

。 Formatterインスタンスの代わりに、値を入力として受け取り、フォーマットされた文字列を返す通常の関数を使用することもできます。そこで、以下

はプラス記号と不要なゼロを除去することにより、数値をフォーマットしまう機能です:

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

x = np.linspace(-6,7, 100) 
X,Y = np.meshgrid(x,x) 
dat = np.exp(-(X-2)**2-(Y-2)**2)* 15e12 

cutoff = 1e6 
CS = plt.contour(dat, [2e6, 5e8, 8e11], norm = matplotlib.colors.LogNorm(vmin=cutoff)) 

def func(x): 
    s = "%.0g" % x 
    if "e" in s: 
     tup = s.split('e') 
     significand = tup[0].rstrip('0').rstrip('.') 
     sign = tup[1][0].replace('+', '') 
     exponent = tup[1][1:].lstrip('0') 
     s = ('%se%s%s' % (significand, sign, exponent)).rstrip('e')  
    return s 

plt.clabel(CS, fontsize=9, inline=1, fmt=func) 

plt.show() 

enter image description here

関連する問題