Dr. Berendsen の Python プログラム アップデート

(2) 累積分布の折れ線グラフ

(1)へ    (3)へ    Workbench Pythonへ

Updating Python Codes 0.1 and 2.1 (p.176) for Figs. 2.1 and 2.2 (p.8)
<元のコード code 2.1.py>

30個の実験データ xi (i=1..N)を小さい順に並べ、xiを横軸に、i を縦軸に取ってグラフ化します。 原著では乱数を使う次のコードで処理しています。

  1. from scipy import *
  2. x = 8.5 + randn(30)
  3. xr = x.sort().round(2)
  4. from plotsvg import *
  5. autoplotc(xr,title='Cumulative distribution')
案の定、plotsvg が認識されませんでしたので、プログラムを自作しました。
  1. code 2.1bb.py・・・テキストp.8の乱数データをcsvファイル (その内容)から読み込む。右図はその結果です(ndata=30)。
  2. code 2.1cc.py・・・乱数をその都度発生させてデータとする。 同一のデータについて縦軸が均一のグラフと重みつきのグラフを描きます。と 右下の二がその結果です(ndata=200)。
<code2.1bb.py からのグラフィックス出力>

<モジュール化>

上右の図は隣接する(xi,yi) を __| のパターンでつないだものですが、グラフとしては 隣接する節点(uk,vk)間に直線を引いたものとなります。max k は max i の倍です。 この作業は一つのモジュールとしてまとめておくとプログラミングが楽になります(Modula-2 では当然の発想です)。 というわけで次のようなモジュールを試作しました。

  • hwbfiles・・・テキストファイルを読んでデータを得る。
  • hwblines・・・(xi,yi)を(uk,vk) に変換する。縦軸はデータ数またはパーセント。 yiの初期値は1だが(右の図)、重みをつけることもできる(右下の図)。
  • statpos・・・平均値等に対応するグラフ上の位置を出す。
<code2.1cc.py からのグラフィックス出力>

<code 2.1cc.py>

code 2.1cc.pyでは、 正規乱数 xi(i=1,200) を200個発生させて小さい順に並べ、xiを横軸に、i を縦軸に取ってグラフとしています。 データ毎の幅を一定として描いたグラフが真ん中の図です。 データ数が多くなるに従って誤差関数 erf(x) に近づくことが想像できます。

<縦軸の目盛り間隔に傾斜をつける>

目盛りの取り方を工夫すれば上の曲線的グラフを直線的なものに変えることができます。ここでは各データ幅を   wi ∝ 1/gauss(xi-av,σ) としています。gauss関数の 0.5/σ2とあるのを0.3/σ2として描いたのが右図です。 ±σ 等の位置を表す横線が中心に向かって移動していますが、中心付近でデータ密度が高いことを反映しています。

<code2.1cc.py からのグラフィックス出力>

11-7-2022, S. Hayashi