▲ 002_作図機能
■ mc の最大の特徴は作図機能

2002/08/24 Nishimura Hiromi

 mc の主な役割は数値データ処理環境です。でも処理結果の数値だけでは処理結果の意味が判りません。そこで数値データ処理について紹介する前に処理結果を表示する作図機能について紹介しておきます。

[● 折線図] [● 折線図_その2] [● 散布図]

[● 等高線図] [● 濃淡図] [● 鳥瞰図]

[● パラメトリックな3D]

● 折線図

 計算結果は数字で表示されます。でもデータの数が多くなるとその傾向を見るのが大変です。そこで作図するわけです。下記はデータを入力しグラフを描く例です。

データ = |0,3,2,6,5,5,3,6|';
作図(データ);

.OK.
				
 

このように入力データの作図はたったの二行で実行できます。作図は意外に簡単だと思いませんか。これが mc の作図法です。

● 折線図_その2

 上記例ではデータが1列しかありませんでした。でも折線図を描く場合のデータは(x、y)のペアが一般的です。この様な場合には parametricPlot(折線図) 関数を使います。

t = |-π,π|';
t = hokan(t,100,1);
x = sin(t);
y = cos(3・t);
setPlotWindowSize(350,300);
parametricPlot(x,y);

.OK.
				

 t という媒介変数を使い sin, cos 関数でx軸データとy軸データを作っています。これを parametricPlot 関数で表示しています。sin や cos 関数は判ると思いますが、ここでは hokan (補間)という変わった関数を使っています。補間関数はデータとデータの間を尤もらしい値を作る操作で3次スプラインで補間しています(二次導関数まで滑らか?弾性エネルギーが最小?)。でも上記例の補間関数は一次の直線で -π から +π までの数値を 100 個作っています。

x = |0,4|';
hokan(x,5,1);
0.0000
1.0000
2.0000
3.0000
4.0000
.OK.
					
● 散布図

 上記の折線図はデータの並びに関連があるものとして考え点と点を線で結んだグラフです。でもデータの中にはデータの並びに関係がないものもあります(時系列データから時間を無視するグラフで頻繁に利用する)。そのようなデータには parametricPointPlot (散布図) 関数を利用します。下記は正規乱数(標準偏差1で平均がゼロになる乱数)データを発生させ、その散布図を描画するプログラム例です。

r = nRand(|500,2,1,0|);
x = r[#,1];
y = r[#,2];
parametricPointPlot(x,y);

.OK.
				

データ並びに関連がない場合は散布図を使ってグラフを描く。

参考:x軸データのヒストグラム

f = frequency(x[#,1],|4,-4,21|);
setPlotWindowSize(250,250);
plotStackBar(f[#,1],f[#,2],|-4,4,1,0,100,20,0,0.2|);

.OK.
					
● 等高線図

 地図上の高さのようにm行n列の格子状のデータがあります。このデータから等高線を描くには contourPlot (等高線図) 関数を使います。下記は5行5列のデータの等高線図を描画する例です。

dat = |0,1,3,2,1|
      |2,3,4,1,0|
      |1,3,5,4,2|
      |0,1,2,3,1|
      |1,3,3,2,1|;
contourPlot(dat);

.OK.
				

 このようにデータが5行5列と少ない場合には等高線の角が折れ、あまり見やすいものにはなりません。そこでデータの数が少ない場合にはデータとデータの間を尤もらしいデータで補間し綺麗に描画させます。

dat = |0,1,3,2,1|
      |2,3,4,1,0|
      |1,3,5,4,2|
      |0,1,2,3,1|
      |1,3,3,2,1|;
dat = hokan(dat,40,40);
contourPlot(dat);

.OK.
				

 データを5行5列から補間関数で40行40列にすると上記のように等高線の角がなくなり見やすくなります。実際、脳波の計測では電極配置は 10-20 法が使われ頭部に装着する脳は電極の数は 21〜25 個程度です。そのため脳波等電位図の描画には上記の様に電極と電極の間を補間し脳波の等電位図を描画します。

 でも注意していただきたいのはデータとデータの間は尤もらしいデータで補間しただけで本当のデータではない点です。ただし私たちが住んでいる世界を作った神様は意地悪ではないようで、上記の様な補間(二次導関数まで滑らか)でも十分に実用になります。

● 濃淡図

 上記に5行5列のデータを等高線図で表現するグラフを紹介しました。5行5列のようなデータは等高線図の他に濃淡図で表現する方法もあります

dat = |0,1,3,2,1|
      |2,3,4,1,0|
      |1,3,5,4,2|
      |0,1,2,3,1|
      |1,3,3,2,1|;
a# = densityPlot(dat);
changePictSize(a#,|200,200|);

.OK.
				

 等高線図で紹介した5行5列のデータを濃淡図(疑似カラー)で表現した例です。濃淡図関数では行列の大きさが画像のピクセル数になるため上記例では 5×5 ピクセルの小さな画像になってしまうため changePictSize 関数を使い作図結果の画像を 200×200 ピクセルの大きさに拡大しています。でも単にピクセルが大きくなっただけで綺麗ではありません。そこで等電位図と同じようにデータとデータの間を補間関数をつかって尤もらしいデータを埋め込んでみます。

dat = |0,1,3,2,1|
      |2,3,4,1,0|
      |1,3,5,4,2|
      |0,1,2,3,1|
      |1,3,3,2,1|;
dat = hokan(dat,200,200);
a# = densityPlot(dat);
a#;

.OK.
				

 いかがでしょうか。これで濃淡図も等高線のように滑らかに描画できました。ついでに画像どうしの演算について紹介しておきましょう。 mc には画像変数という変数が定義されています。上記でも使っているよう変数名の後に # が付いた変数です。これを利用すると MacOS X のアクアのような合成が可能になります。

dat = |0,1,3,2,1|
      |2,3,4,1,0|
      |1,3,5,4,2|
      |0,1,2,3,1|
      |1,3,3,2,1|;
a = hokan(dat,40,40);
b = hokan(dat,200,200);
setTopoWindowSize(200,200);
a# = contourPlot(a);
b# = densityPlot(b);
a#;b#;"";
a#/2+b#/2;


.OK.
				

 等高線図の描画結果を画像変数 a# に代入し、濃淡図の描画結果を画像変数 b# に代入します。その後に a#/2 + b#/2 という演算を行っています。これは a#,b# それぞれの画像の各ピクセルの RGB 値を 1/2 し次に加えるという操作です。この演算により2つの画像が合成されました。ただし計算式で a#/2+b#/2 と (a#+b#)/2 が同じでも結果は一緒になりません。試してみましょう。

a#/2+b#/2; (a#+b#)/2;

.OK.

 右の (a#+b#)/2 の方が変に表示されています。これは画像のピクセルの値の範囲が 0〜255 であるため a#+b# の演算の時点で 255 を超えてしまった(オーバーフロー)からです。画像の演算をする時にはオーバーフローに注意しなければなりません。mc では画像の高度な演算をする場合には数値データ(浮動小数点)に変換します。

● 鳥瞰図

 さらに5行5列のデータは等高線図、濃淡図の他に鳥瞰図による表現方法があります。方法は簡単で view3DColor 関数を使うだけです。

dat = |0,1,3,2,1|
      |2,3,4,1,0|
      |1,3,5,4,2|
      |0,1,2,3,1|
      |1,3,3,2,1|;
a = hokan(dat,40,40);
setView3D(|300,200,20,50,10,0.7|);
a# = view3DColor(a);
a#;

.OK.
				

 単に関数名を contourPlot から view3DColor に変更でするだけで鳥瞰図を描く事ができます。それでは関数グラフの例も紹介しましょう。

x = |-1,1||-1,1|*3;
x = hokan(x,40,40);
y = x';
z = x・exp(-x^2-y^2);
setView3D(|300,200,20,20,10,0.7|);
z# = view3DColor(z);
z#;

.OK.
				
● パラメトリックな3D

 等高線図、濃淡図、鳥瞰図は x,y 座標に対して一つの値を持つものしか描画できません。でも一つの x,y 座標に対しz軸方向に複数のデータを持つ場合。例えば球のような場合です。このようなデータを描画するには parametricPlot3DColor 関数を使います。

u = |0,π||0,π|;
u = hokan(u,50,50);
v = |0,2*π||0,2*π|';
v = hokan(v,50,50);
x = sin(u)・cos(v);
y = sin(u)・sin(v);
z = cos(u);
setParametricPlot3D(|200,200,0,40,50,4.8|);
parametricPlot3DColor(x,y,z);

.OK.
				

 上記例は単純な球ですが、もう少し複雑な例も紹介しておきましょう。下記は gnuplot のデモにあったホルンに似た3D作図です。ですが gnuplot のデモをそのままというのも芸がないので少し拡張しまたした。けっかはホルンではなくアンモナイトになっています。

u = |0,2*π||0,2*π|*3;
u = hokan(u,30,100);
v = |0,2*π||0,2*π|;
v = hokan(v',30,100);
x = cos(u)・u・(1+cos(v)/2);
y = sin(v)・u/2;
z = sin(u)・u・(1+cos(v)/2);
RGB = popRGBColor(0);
frameLineDraw(1);
setParametricPlot3D(|300,300,30,30,100,0.20|);
parametricPlot3DColor(x-mean(x)-2.8,y-mean(y),z-mean(z));

.OK.
				

 どうですか mc の作図機能は簡単でしょう。この様に mc にはデータを表現する色々な関数があります。上記で紹介した作図関数には色々なオプションがあります。この他にも紹介しきれない色々な作図関数があるので試してみて下さい。