Sponsored Links
今回は以下の記事でプロットした二項分布を「FigureとAxisを明示的に使ってプロットする方法」でやってみました。
二項分布とは、ベルヌーイ試行という試行についてみられる確率分布のことだそうです。 ベルヌーイ試行とは何かというと、「ある現象についてAかBのどちらかが起こる」と...
matplotlibでは、グラフをプロットする際、内部的にFigureやAxisといったオブジェクトを扱っていますが、前回のやり方ではFigureやAxisといったものを意識せずにグラフのプロットが出来ていたようです。
そこで、明示的にFigureやAxisといったオブジェクトを生成してグラフをプロットしてみることにします。
そもそも、Axisは描画するグラフや図形を格納しているクラスのようです。
FigureはそのAxisを保持していて、つまりAxisを配置するためのエリアという感じになっているみたいです。
りんごがでている | matplotlib入門を参考にしたところ、グラフのプロット手順はこんな感じだそうです。
- プロットするデータの用意
- グラフを配置する領域の用意(Figureオブジェクトの生成)
- グラフをプロットする領域の用意(Axisオブジェクトの生成)
- データを渡してグラフをプロット
- グラフの目盛りやタイトルなどの調節(オプション)
コーディング
データの用意は省略することにして、まずはFigure,Axisオブジェクトの生成です。
1 2 3 4 5 6 7 8 9 10 11 | # ------------------------- # Figureオブジェクトを生成する # ------------------------- fig = plt.figure() # ------------------------ # Axisオブジェクトを生成する # ------------------------ # Figureに配置するグラフの行数,列数,番号を指定する # 111⇒1行,1列の1番目に配置 ax = fig.add_subplot(111) |
続いて描画ですが、これは単にAxisオブジェクトのbar()を使えば棒グラフをプロットできます。
1 2 3 | # 引数は、横軸の値と縦軸の値 # xList(Series型).indexでシリーズのインデックスリストを取得できる。 ax.bar(xList.index,xList) |
ついでに、グラフの細かい調整もいくつかやってみます。
1 2 3 4 5 6 7 8 9 10 11 | # -------------------------------------------------------------------- # その他の設定 # -------------------------------------------------------------------- ax.set_ylim(0.0,0.2) # y軸の範囲の設定 ax.set_xlim(0.,100.) # x軸の範囲の設定 ax.set_xlabel("確率変数") # x軸のラベル設定 ax.set_ylabel("確率") # y軸のラベルの設定 plt.rcParams['font.family']='M+ 1c' #フォントの設定 ax.set_title("二項分布") #タイトルの設定 fig.set_size_inches(10,4) #Figure(グラフ配置領域)のサイズ設定 |
標準的な偏差の範囲を可視化してみる
せっかくなので、今回プロットしたグラフに「起きても特別不思議じゃない範囲」を見えるようにしてみます。具体的には
$$ 平均(\mu) \pm 標準偏差(\sigma) $$
の範囲を表す四角形をグラフに重ね合わせてみます。記号ですが、二項分布では
$$平均 = \mu$$
$$標準偏差(S.D.) = \sigma $$
と表す決まりだそうです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | pUpper=mean+sd # 平均+S.D. pLower=mean-sd # 平均-S.D. # ---------------------------------------- # 範囲を表す四角形の頂点定義 # 0--------1 # | | # | | # | | # | | # 3--------2 # ---------------------------------------- vertices = [(pUpper,0.), // 0 (pUpper,0.2), // 1 (pLower,0.2), // 2 (pLower,0.), // 3 (pUpper,0.), // 4=0と同じ値 ] # ---------------------------------- # 頂点ごとにパスの描き方を指定する。 # MOVETOではじめて、LINETOでつないで # CLOSEPOLYで閉じると考えれば良いかな。 # ---------------------------------- codes = [Path.MOVETO, Path.LINETO, Path.LINETO, Path.LINETO, Path.CLOSEPOLY, ] # Pathオブジェクトを作成 path = Path(vertices,codes) # PathPachオブジェクトを作成する。 # 引数は、pathオブジェクト,面の色,線種,透過度,線の幅 patch = patches.PathPatch(path,facecolor='red',ls="None",alpha=0.1,lw=0) # Axisに作成したPatchオブジェクト配置する。 ax.add_patch(patch) |
プロットされたグラフはこんな感じになりました。
Sponsored Links