MatplotlibのY軸の目盛りを指数表記（10のN乗表記）に変更する

##ex1)グラフを描画する

```py3:test1.py

import sqlalchemy
import pandas as pd
import matplotlib.pyplot as plt

# SQLAlchemy初期化
CONNECT_INFO = 'mssql+pyodbc://hogehoge'
engine = sqlalchemy.create_engine(CONNECT_INFO, encoding='utf-8')

#変数設定
qq = 1
ym = 201607

#DB接続、ストアド実行、pandasデータフレーム作成
query = 'EXEC dbo.sp_rtrv_hogehoge @q = {0},@prd = {1}'.format(qq,ym )
df = pd.read_sql_query(query, engine  ,index_col =['t'])

#グラフ描画
ax = df.plot(  color=('b','r') , alpha=0.6  )
plt.title('hogehoge_title')
plt.grid(which='major')
#ax = plt.gca()

#ファイル保存
fname ='test'+ str(ym) +'.png'
plt.savefig(fname) 
plt.close()  

```
・pandas(df)のplot()は、matplotlibのplt.plot()のラッパーメソッド
・上記ではSQLSevrerのストアドプロシージャを実行（SQLServerではストアドをEXECで実行）
・ストアドの引数（qqとym）は、pythonの変数埋め込み表記にて指定
・`ax = plt.gca()`で現在編集中のグラフを取得することができる

・上記ではY軸の目盛りがなにも施していないので、例えば100万の場合、そのまま「1000000」と表記される

Y軸の目盛り↓
![ex1.png](https://qiita-image-store.s3.amazonaws.com/0/91974/0a34832e-9750-e6e4-6c3a-47f7a255a315.png)

##ex2)Y軸の目盛りを指数表記(scientific notation)に変更する

```py3:test1.py

import sqlalchemy
import pandas as pd
import matplotlib.pyplot as plt

#(中略)

#グラフ描画
ax = df.plot(  color=('b','r') , alpha=0.6  )
#ax = plt.gca()
ax.ticklabel_format(style="sci",  axis="y",scilimits=(0,0))

```

Y軸の目盛り↓
![ex2.png](https://qiita-image-store.s3.amazonaws.com/0/91974/9a629a8c-204e-622d-a649-c69ca5c455ed.png)


・なんか「データサイエンティスト」風な目盛りになった（笑
ただle6の表記だと、メカに弱い文系オサーン上司があぼーん（白目）となってしまうおそれがあるので、これを微調整したのが次のex3。


##ex3)Y軸の目盛りを10のべき乗表記に変更する

```py3:test1.py

import sqlalchemy
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.ticker import ScalarFormatter

#(中略)

#グラフ描画
ax = df.plot(  color=('b','r') , alpha=0.6  )
#ax = plt.gca()
ax.yaxis.set_major_formatter(ScalarFormatter(useMathText=True))
ax.ticklabel_format(style="sci",  axis="y",scilimits=(0,0))

```

・ScalarFormatterのプロパティを`useMathText=True`にしてあげると、10のべき乗表記になる。
・100万は$1×10^6$（**10の6乗**、つまりゼロが6つ）

Y軸の目盛り↓
![ex3.png](https://qiita-image-store.s3.amazonaws.com/0/91974/885db9df-dc80-1579-945b-79329f853494.png)

##ex4)Y軸の目盛りを1×10^6から1×10^4に変更する

```py3:test4.py

import sqlalchemy
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.ticker import ScalarFormatter

#クラス設定  ※ScalarFormatterを継承
class FixedOrderFormatter(ScalarFormatter):
    def __init__(self, order_of_mag=0, useOffset=True, useMathText=True):
        self._order_of_mag = order_of_mag
        ScalarFormatter.__init__(self, useOffset=useOffset, 
                                 useMathText=useMathText)
    def _set_orderOfMagnitude(self, range):
        self.orderOfMagnitude = self._order_of_mag

#(中略)

#グラフ描画
ax = df.plot(  color=('b','r') , alpha=0.6  )
#ax = plt.gca()
ax.yaxis.set_major_formatter(FixedOrderFormatter(4 ,useMathText=True))
#ax.yaxis.set_major_formatter(ScalarFormatter(useMathText=True))
ax.ticklabel_format(style="sci",  axis="y",scilimits=(0,0))

```

・データによっては100万表記（$1×10^6$）ではなく、万単位（$1×10^4$）にしたい場合がありますよね！
・matplotlibのgithubやら、stackOverflowなどいろいろ検索して調べてみると、どうやらScalarFormatterというのは、orderOfMagnitudeというものを持っていて、ここで10のN乗のNの部分を制御している模様。
・上記ではScalarFormatterを継承するクラスを設定して、`useMathText=True`の状態はそのままに、ScalarFormatterのorderOfMagnitudeを指定する形で、10の4乗表記に変更している。

Y軸の目盛り↓
![ex4.png](https://qiita-image-store.s3.amazonaws.com/0/91974/30e4de8e-4a37-800d-5353-bfe5755037f6.png)

・1万は$1×10^4$（**10の4乗**、つまりゼロが4つ）なので、100万は$100×10^4$

##参考URL
・[【matplotlib】軸の目盛りを指数表記にしたいです](http://villageofsound.hatenadiary.jp/entry/2014/11/06/155824)(via.ねるねるねるねをねらずにくうぜ)
・[matplotlib: format axis offset-values to whole numbers or specific number](http://stackoverflow.com/questions/3677368/matplotlib-format-axis-offset-values-to-whole-numbers-or-specific-number)(via.stackOverflow)
・github:[matplotlib/lib/matplotlib/ticker.py](https://github.com/matplotlib/matplotlib/blob/master/lib/matplotlib/ticker.py)