Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした