##ex1)グラフを描画する
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」と表記される
##ex2)Y軸の目盛りを指数表記(scientific notation)に変更する
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))
・なんか「データサイエンティスト」風な目盛りになった(笑
ただle6の表記だと、メカに弱い文系オサーン上司があぼーん(白目)となってしまうおそれがあるので、これを微調整したのが次のex3。
##ex3)Y軸の目盛りを10のべき乗表記に変更する
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つ)
##ex4)Y軸の目盛りを1×10^6から1×10^4に変更する
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乗表記に変更している。
・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