2016-01-25 155 views
7

matplotlibで次のプロットを作成しています。とりわけ、plt.ticklabel_format(axis='y',style='sci',scilimits=(0,3))を使用しています。これは、ように、y軸が得られます。 科学軸でプロットし、有効数字の数を変更する

enter image description here

が今の問題は、私は、y軸は [0, -2, -4, -6, -8, -12]からダニを持つようにしたいということです。私は scilimitsで遊んだことがあるが、役に立たない。

どのように1つの重要な数字と後ろにゼロがなく、必要なときに浮動小数点数になるようにすることができますか?

MWEは、以下の追加:

import matplotlib.pyplot as plt 
import numpy as np 

t = np.arange(0.0, 10000.0, 10.) 
s = np.sin(np.pi*t)*np.exp(-t*0.0001) 

fig, ax = plt.subplots() 

ax.tick_params(axis='both', which='major') 
plt.ticklabel_format(style='sci', axis='x', scilimits=(0,3)) 
plt.plot(t,s) 

plt.show() 
+0

カットアンドペースト可能なコードを追加できますか? – atomh33ls

+1

http://stackoverflow.com/help/mcve – atomh33ls

+0

お詫び申し上げます。 – Astrid

答えて

1

私はこの問題に遭遇した場合には、ダニのカスタムFuncFormatterを使用していたと、私が思い付くことが最高。しかし、軸に沿ってスケール(例えば、1e5)を表示させる方法は見つけられませんでした。簡単な解決策は、ティックラベルを手動で含めることでした。

申し訳ありませんが、これは完全に質問に答えていないが、それは私の解決策は次のように多少見えますMWEで問題:)

に比較的簡単な解決策として十分可能性がある場合:

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


def tickformat(x): 
    if int(x) == float(x): 
     return str(int(x)) 
    else: 
     return str(x)   


t = np.arange(0.0, 10000.0, 10.) 
s = np.sin(np.pi*t)*np.exp(-t*0.0001) 

fig, ax = plt.subplots() 

ax.tick_params(axis='both', which='major') 
plt.plot(t,s) 

fmt = FuncFormatter(lambda x, pos: tickformat(x/1e3)) 
ax.xaxis.set_major_formatter(fmt) 

plt.xlabel('time ($s 10^3$)') 

plt.show() 

注意この例では、x軸が操作されます。

enter image description here

はもちろん、これはデータを再スケーリングしても、単純に達成することができました。しかし、私はあなたがデータに触れて軸を操作したくないと仮定します。

+0

ありがとうございました。ありがとうございました。それは、これを行うための一見良い方法がないことは非常に奇妙です。 – Astrid

+1

私は同意しますが、本当のmatplotlib gurusの1人が後で来て、簡単で実用的な解決策を提供するでしょう;) – kazemakase

+0

まさに、誰かが願っています:) – Astrid

0

これは、ScalarFormatterにあるノブではわかりません。このような何か:

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

t = np.arange(0.0, 10000.0, 10.) 
s = np.sin(np.pi*t)*np.exp(-t*0.0001) 

class EpiCycleScalarFormatter(mticker.ScalarFormatter): 
    def _set_orderOfMagnitude(self, rng): 
     # can just be super() in py3, args only needed in LPy 
     super(EpiCycleScalarFormatter, self)._set_orderOfMagnitude(rng) 
     if self.orderOfMagnitude != 0: 
      self.orderOfMagnitude -= 1 


fig, ax = plt.subplots() 

ax.tick_params(axis='both', which='major') 
ax.yaxis.set_major_formatter(EpiCycleScalarFormatter()) 
ax.xaxis.set_major_formatter(EpiCycleScalarFormatter()) 
plt.ticklabel_format(style='sci', axis='x', scilimits=(0,3)) 
plt. 
plt.show()plot(t,s) 

enter image description here

はあなたの問題を解決します。サブクラスの名前に注意してください。これはエピサイクリングを追加するだけです(既存のコードと同じように見えますが、複雑さを増やすだけです)。これはまた、私たちがいつでも壊れるかもしれない図書館の私的な部分にも触れます。

関連する問題