ねるねるねるねをねらずにくうぜ

C とかC++(予定)とかpythonとかgnuplotとかmatlabとかmathematicaとか書く予定ですが、最終的にはねるねるねるねをねらずに食うことを目標にしているブログです

【matplotlib】軸の目盛りを指数表記にしたいです

HDF5の読み込みは次回にまわします。ごめんね。 今回は、個人的にむっちゃ苦労したお話について、メモ。

目的は、

  • Scientific notationの指数を10^{n}にする
  • Scientific notationの指数の文字をでかくする

です。

まずは状況設定

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(1,1000,1)
y = 10e-7*x

fig, ax=plt.subplots(figsize=(5*1.618,5))
ax.plot(x,y)

これ、y軸の目盛り・・・指数表記したくない?したいよね?

というわけで、こいつをうまく指数表記する方法をここでは述べます。

結論

以下のようにやれ。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as ptick ##これが必要!
x = np.arange(1,1000,1)
y = 10e-7*x

fig, ax=plt.subplots(figsize=(5*1.618,5))
ax.plot(x,y)

ax.yaxis.set_major_formatter(ptick.ScalarFormatter(useMathText=True)) 
ax.yaxis.offsetText.set_fontsize(10)
ax.ticklabel_format(style='sci',axis='y',scilimits=(0,0))

以下解説なので、暇なら読んでね。

指数表記のやりかた

まずは指数表記にしましょう。

これは、

import numpy as np
import matplotlib.pyplot as plt
x = np.arange(1,1000,1)
y = 10e-7*x
fig, ax=plt.subplots(figsize=(5*1.618,5))
ax.plot(x,y)

ax.tick_params(labelsize=22)
ax.ticklabel_format(style='sci',axis='y',scilimits=(0,0)) #こいつ!!

とするとできる。こんな感じ↓

style は "plain" と "sci(or science)"が選べて、sciにすると指数表記になる。 また、scilimits=(n,m)は"nからmの外にあるやつは指数表記で頼むよ!"って意味。 (0,0)にすれば全部指数表記ってわけ。

指数表記文字を大きくしたい!!!

ムカつくのは、指数表記文字(1e-3っての)が小さすぎること。

実はこれ、tick_paramsでラベルサイズを変更しても、ここは据え置き。

これはどうやら、tick objectとかではなくて、固有のobjectとして存在してそう。 んで、実は、"offset"という名前が付いているそうです。といるわけで、"offset"のオブジェクトをいじっていけばいいのかな。suggestion 探してみると・・・

ax.yaxis.offsetText.set_fontsize()

うむ。実にそれっぽいのが見つかった。引数にフォントサイズを入れれば良さそう。

ax.yaxis.offsetText.set_fontsize(44)

この一文を追加すると↓

デカァァァァァいッ説明不要!! fontsize44!! 12.5KB!!! 1e-3だ!!!

老若男女、みんなハッピー10の冪乗表記

でもさ、1e-3っていう表記より、1✕10^{-3}って表記にしたくない? 少なくともやる方法は知っておいたほうがいいよね。

これをするには、2つのことをします。 一つは、matplotlib.ticker をインポート。まぁ、インポートしなくても、直打ちで指定すればいいけど、むっちゃ長くなるのでインポートしときましょう。

2つ目はset_major_formatterを使う。これは、目盛りのフォーマット(文字・数字の書き方)を指定するニクいやつ。

この2文を加えましょう

import matplotlib.ticker as ptick
ax.yaxis.set_major_formatter(ptick.ScalarFormatter(useMathText=True)) 

こんなかんじに変身↓

デカァ(略)

じつは自分もよくわかってないけど、ScalarFormatterでuseMathTextってやつが立ってるかどうかで指数表記がどうなるか決まってるのかな?

ともあれ、これで目的達成。

まとめ

  • 指数表記は
ax.ticklabel_format(style='sci',axis='y',scilimits=(0,0))
  • 指数文字は"offset"という名前。
  • 10のべき乗は"ScalorFormatter"で"useMathText=1"

ちなみに自分はこの3つを遂行するために、昨日2時間費やしました(ブチギレ)