LoginSignup
59
68

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-07-27

ex1)グラフを描画する

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

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

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

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

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

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

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

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

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

参考URL

【matplotlib】軸の目盛りを指数表記にしたいです(via.ねるねるねるねをねらずにくうぜ)
matplotlib: format axis offset-values to whole numbers or specific number(via.stackOverflow)
・github:matplotlib/lib/matplotlib/ticker.py

59
68
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
59
68