第5章 いろいろなグラフ

第5章
いろいろなグラフ
この章ではさまざまなグラフについて紹介します.3 次元のラインプロッ
トやサーフェスプロット,棒グラフや円グラフなどを紹介します.これら
を使えば,レポートやプレゼンテーションで多彩な表現ができます.
とはいえ,豊富なグラフ機能の全てを紹介することはとてもできませ
ん.使いこなしたい方はぜひ一度マニュアルに目を通されることをお勧め
します.そして,自分なりの使い方を開発してください.
c 2004 Tatsuya Kitamura / All rights reserved.
copyright 57
第5章
5.1
いろいろなグラフ
3 次元のラインプロット
MATLAB で 3 次元のグラフをラインプロット(line plot)するには
plot3MAT を使います.使い方は plot とほとんど同じで,引数に Z 軸の
データが加わる点だけが異なります.
Octave では gnuplot の splot に対応する gsplotOCT によって 3 次元の
グラフをプロットしますが,本書では説明しません.splot については文
献1 に詳しいのでそちらを参照してください.
plot3MAT では plot と同じオプション(表 5.1,表 5.2,表 5.3)によ
りラインやマーカーの種類を指定することができます.オプションは指定
しなくてもかまいません.plot と同様にして複数のラインを表示するこ
ともできます.
以下のコマンドを実行すると,図 5.1 のグラフが得られます.
>>
>>
>>
>>
t=0:pi/20:10*pi;
plot3(t.*cos(t),t.*sin(t),t)
grid on
xlabel(’X’); ylabel(’Y’); zlabel(’Z’);
35
30
25
Z
20
15
10
5
0
30
20
40
10
30
20
0
10
−10
0
−10
−20
Y
−30
−20
−30
X
図 5.1: plot3 の実行例
3 次元のグラフでもラベル,タイトル,凡例を付けることができます.
axis で表示範囲を指定することもできます.
5.2
3 次元のサーフェスプロット
3 次元のサーフェスプロット(surface plot)のための代表的なコマンド
は mesh と surfMAT です.mesh は Octave にもあります.
1
58
川原稔, “gnuplot パーフェクト・マニュアル”, ソフトバンク (1999).
5.2. 3 次元のサーフェスプロット
MATLAB には 3 次元プロットのデモに便利な peaksMAT が用意されてい
ます.このコマンドで得られる行列を mesh でプロットしたものを図 5.2
に示します.あわせて colorbarMAT でカラーバーも表示させました.
>> z=peaks;
>> mesh(z)
>> grid on; colorbar
8
6
10
8
4
6
4
2
2
0
−2
0
−4
−6
−2
−8
50
40
50
30
−4
40
30
20
20
10
10
0
−6
0
図 5.2: mesh の実行例.
プロットのカラーマップは colormap で変更することができます.現時
点のカラーマップは
>> map=colormap;
で得ることができます.カラーマップは RBG で表され,赤,緑,青の強
さを 0 から 1 の間の値で表します.
デフォルトのカラーマップに戻すには次のようにします.
>> colormap(’default’)
59
第5章
いろいろなグラフ
図 5.2 には陰線処理が施されていますが,MATLAB では図 5.3 のよう
に hiddenMAT を使ってこれを外すこともできます.
>> hidden off
8
6
10
8
4
6
4
2
2
0
−2
0
−4
−6
−2
−8
50
40
−4
50
30
40
30
20
20
10
−6
10
0
0
図 5.3: 陰線処理を外した状態.
meshcMAT を使うと図 5.4 のようにコンタープロット(contour plot)も
あわせて表示されます.以下の例では,カラーバーを水平方向に付けるコ
マンドです.
>> meshc(z); grid on
>> colorbar(’horiz’)
10
5
0
−5
−10
50
40
50
30
40
30
20
20
10
10
0
−6
−4
−2
0
0
2
4
6
8
図 5.4: meshc の実行例.カラーバーを水平方向に付けた.
Octave で図 5.4 と同じようなコンタープロット付きのグラフを得るに
は,gsetOCT を使って以下のようにします.
60
5.3. meshgrid
octave:5> mesh(z)
octave:6> gset contour base
octave:7> replot
今度は surfMAT と surfcMAT でプロットしてみましょう.peaksMAT で求
めた行列をプロットすると図 5.5 のようになります.
>> subplot(121); surf(z); title(’surf’);
>> subplot(122); surfc(z); title(’surfc’);
surfc
surf
10
10
8
6
5
4
2
0
0
−2
−5
−4
−6
−8
−10
60
60
60
40
60
40
40
20
20
0
0
40
20
20
0
0
図 5.5: surf(左)と surfc(右)の実行例.
Tips hot なカラーマップ
MATLAB には「hot な」カラーマップを作る hotMAT が用意されて
いて,これを colormap の引数にすると文字通り hot な色使いになり
ます.
>> colormap(hot)
この他にも coolMAT ,flagMAT ,gray などのコマンドが用意されてい
ます.カラーマップを作るコマンドは次のように lookforMAT で探せ
ます.
>> lookfor ’color map’
5.3
meshgrid
前の節では peaksMAT で得られた値をプロットしていましたが,もち
ろん任意の関数 z = f (x, y) をプロットすることもできます.ここでは,
61
第5章
いろいろなグラフ
z = x2 − y 2 という関数をプロットしてみます.x と y の範囲は −5∼5 と
します.
まず,meshgrid によって X–Y 平面上の座標を表す行列 x,y を作り
ます.
>> [x,y]=meshgrid(-5:5);
スペースの関係でここには載せませんが,読者のみなさんはぜひ x と y
の値を確認してください.
次に,z = x2 −y 2 を計算します.以下の例では,z を求める際 .^ を用い
ることで行列演算として計算しています.これはベクトル化 (vectorize)
と呼ばれる手法の 1 つです.ベクトル化については後の章で詳しく説明し
ます.
>>
>>
>>
>>
z=x.^2-y.^2;
mesh(z)
grid on
box on
最後の box は図に箱の枠を表示させるコマンドです.こうして得られた
グラフを図 5.6 に示します.
30
20
10
0
−10
−20
−30
12
10
12
8
10
6
8
6
4
4
2
2
0
0
図 5.6: z = x2 − y 2 のグラフ.
♣ TRY z = cos(x) + sin(y) を mesh でプロットしてみよう.x と y の範
囲は −2π ∼2π とします.
62
5.4. 視点の設定
5.4
視点の設定
view を使って 3 次元のグラフの視点の設定ができます.視点を変える
ことによってグラフの見え方が変わります.視点は極座標系で設定しま
す2 .図 5.7 に示すようにグラフの原点からの 俯角(azimuth)と 仰角
(elevation)によって視点を設定します.
z
x
視点
グラフ
の中心
仰角
y
俯角
図 5.7: 極座標系による視点の設定.マニュアル “Using MATLAB Graphics” 中の図を改変.
POINT 極座標系による視点の設定
MATLAB の場合:
view(俯角, 仰角) または view([俯角, 仰角])
(俯角は 0∼180◦ ,仰角は 0∼360◦ の範囲)
Octave の場合:
gset view 俯角, 仰角
MATLAB の 3 次元グラフでは,俯角は −37.5◦ ,仰角は 30◦ がデフォル
トです.view によって現在の視点を知ることができます.
>> [az,el]=view;
az に俯角,el に仰角が入ります.Octave の 3 次元グラフでは俯角が 60◦ ,
仰角は 30◦ がデフォルトです.Octave で現在の視点を知るには gshow view
を実行します.
2
MATLAB では view([X Y Z]) として直交座標系で視点を指定することもできます.
63
第5章
いろいろなグラフ
view を使って視点を変えてみましょう.少し上からの視点にするため
に仰角を 60◦ にしてデフォルトの視点と比較した図を 図 5.8 に示します.
>> z=membrane;
>> mesh(z)
>> view(-37.5,60)
membraneMAT は Mathworks のロゴとして使われている 3 次元グラフのデー
タを出力するコマンドです.
view(−37.5,30)
view(−37.5,60)
1
0.8
1
0.6
0.5
0.4
0.2
0
0
−0.5
40
−0.2
40
30
−0.4
40
30
30
40
20
20
30
20
20
10
10
10
10
0
0
0
0
図 5.8: 仰角の違いによるグラフの違い.
Octave では,以下のように gsetOCT で視点を設定した後,replotOCT を
実行する必要があります.
octave:8> gset view 37.5,60
octave:9> replot
♣ TRY 俯角を 142.5◦ にしてみよう.
64
5.5. 片対数・両対数グラフ
5.5
片対数・両対数グラフ
X 軸が対数のグラフは semilogx,Y 軸が対数のグラフは semilogy,
X 軸と Y 軸がともに対数のグラフは loglog によってプロットすること
ができます.使い方は plot と同じです.
>>
>>
>>
>>
>>
x=1:10; y=2.x;
subplot(221); plot(x,y); grid on
subplot(222); semilogy(x,y); grid on
subplot(223); semilogx(x,y); grid on
subplot(224); loglog(x,y); grid on
plot
semilogy
4
1200
10
1000
3
10
800
2
600
10
400
1
10
200
0
0
0
2
4
6
8
10
semilogx
10
0
4
1200
2
4
6
8
10
loglog
10
1000
3
10
800
2
600
10
400
1
10
200
0
0
10
0
1
10
10
0
10
1
10
図 5.9: plot(左上),semilogx(左下),semilogy(右上),loglog
(右下)によるグラフ.
65
第5章
いろいろなグラフ
棒グラフ
5.6
2 次元の棒グラフの表示には bar と barhMAT を用います.前者はグラフ
が縦向き,後者は横向きになります.rand で生成した 5 × 3 のランダム
データをプロットしたものを図 5.10 に示します.
>> data=rand(5,3);
>> bar(data)
>> grid on
この例の data は 5 × 3 行列ですが,行方向のデータが X 軸,列方向の
データが Y 軸としてプロットされます.棒グラフの色も colormap で設
定できます.
bar
barh
1
0.9
5
0.8
0.7
4
0.6
0.5
3
0.4
0.3
2
0.2
0.1
0
1
1
2
3
4
5
0
0.2
0.4
0.6
0.8
1
図 5.10: bar(左)と barh(右)による棒グラフ.
Octave では bar は棒グラフのデータを作るだけのコマンドでプロット
はしません.このコマンドでデータを作った後に plot でプロットする必
要があります.
octave:10> data=rand(10,3);
octave:11> [x,y]=bar(data);
octave:12> plot(x,y)
ここで,plot(y,x) とすれば横向きにプロットできます.
MATLAB では積み上げ型の棒ブラフや 3 次元の棒グラフをプロットす
ることもできます.積み上げ型の棒グラフをプロットするには,bar に
stackMAT オプションを付けます.
>> bar(data,’stack’)
66
5.6. 棒グラフ
3 次元の棒グラフのプロットには bar3MAT と bar3hMAT を用います.前
者はグラフが縦向き,後者は横向きになります.これらのコマンドでも
stackMAT オプションを使うことができます.
>> bar3h(data)
これらのプロットを図 5.11 に示します.
stack
2.5
bar3h
2
5
4
1.5
3
2
1
1
0
0.5
0.5
1
0
1
2
3
4
5
図 5.11: 積み上げ型の棒グラフ(左)と 3 次元の棒グラフ(右).
67
第5章
いろいろなグラフ
ヒストグラム
5.7
ヒストグラムは hist を用いてプロットします.ここでは,正規分布の
ランダムデータのヒストグラムと一様分布のランダムデータのヒストグラ
ムを図 5.12 に示します.
>>
>>
>>
>>
n=randn(10000,1);
subplot(121); hist(n); grid on
u=rand(10000,1);
subplot(122); hist(u); grid on
randn(10000,1)
rand(10000,1)
3000
1200
2500
1000
2000
800
1500
600
1000
400
500
200
0
−4
−2
0
2
4
0
0
0.2
0.4
0.6
0.8
1
図 5.12: randn(10000,1)(左)と rand(10000,1)(右)のヒストグラム.
Tips 日記をつけておこう
手の込んだグラフを作るときには,diaryMAT を使ってその手順を残し
ておくと次のときに役立ちます.diary on を実行すると,MATLAB
を終了するか diary off を実行するまでのコマンドラインの入出力
を diary というファイルに記録します.保存するファイルを指定する
場合には diary(’filename’) を実行します.
68
5.8. 円グラフ
5.8
円グラフ
2 次元の円グラフは pieMAT ,3 次元の円グラフは pie3MAT を使います.こ
こでは,とあるマシンのハードディスクのパーティション分割の状態を 図
5.13(左)のように円グラフにしてみました.単位は MB です.
>> df=[15 100 95 200 84 97];
>> pie(df)
データをベクトルとして与えると,それぞれの要素のパーセンテージが
計算され,円グラフになります.ここで以下のようにラベルを指定すると
パーセンテージの代わりにラベルが表示されます.
>> pie(df,{’sd0a’ ’sd0f’ ’sd0d’ ’sd0e’ ’sd0g’ ’sd0h’})
指定した領域を切り離すこともできます.データと同じ長さで要素が全
て 0 のベクトルを作り,切り離したい領域に対応する要素を 1 にします.
そしてそのベクトルを pieMAT の 2 つ目の引数にします.以下の例では 4 番
目の領域を切り離しています.こうして得られる円グラフを図 5.13(右)
に示します.
>> ex=zeros(size(data)); ex(4)=1;
>> pie(df,ex,{’sd0a’ ’sd0f’ ’sd0d’ ’sd0e’ ’sd0g’ ’sd0h’})
3%
sd0a
16%
sd0h
17%
sd0f
14%
16%
sd0g
sd0d
34%
sd0e
図 5.13: とあるマシンのハードディスクのパーティション分割の状態
69
第5章
5.9
いろいろなグラフ
コンタープロット
コンタープロット(contour plot)をプロットするには contour を使い
ます.以下の例では z = cos(x) + sin(y) のコンタープロットを 10 段階で
プロットしています.得られるコンタープロットを図 5.14 に示します.
>>
>>
>>
>>
>>
t=-2*pi:pi/20:2*pi;
[x,y]=meshgrid(t);
z=cos(x)+sin(y);
contour(z,10)
axis square
contour の第 2 引数の 10 は 10 段階のコンター(輪郭線)を表示させる
ことを意味しています.最後の axis squareMAT は 2 次元グラフを正方形
に,3 次元グラフを立方体に表示するコマンドです.
6
4
2
0
−2
−4
−6
−6
−4
−2
0
2
4
6
図 5.14: z = cos(x) + sin(y) のコンタープロット.
さらに,clabelMAT によってラベルを表示させることもできます.また,
contour3MAT により 3 次元のコンタープロットがプロットでき,contourfMAT
によりコンター間を色分けすることもできます.詳しくはオンラインヘル
プなどを参照してください.
70
5.10. 離散データのグラフ
離散データのグラフ
5.10
信号処理の教科書などで見かけるような離散データのグラフは stemMAT
でプロットできます.ここでは,x[n] = αn cos(Ωn) のグラフをプロット
してみます.α = 0.7,Ω = π とします.
>>
>>
>>
>>
alpha=0.7; omega=pi;
n=0:.1:10;
x=alpha.^n.*cos(omega.*n);
stem(n,x); grid on
さらに,LATEX の数式の表記方法を用いてタイトルとラベルを付けます.
>> title(’x[n] = \alpha^n cos(\Omega n)’)
>> xlabel(’n’); ylabel(’x[n]’);
このようにして得られたグラフを図 5.15 に示します.
x[n] = αn cos(Ω n)
1
0.8
0.6
0.4
x[n]
0.2
0
−0.2
−0.4
−0.6
−0.8
0
1
2
3
4
5
6
7
8
9
10
n
図 5.15: x[n] = αn cos(Ωn) のグラフ.
次のように filled オプションを指定すると,マーカー内が塗りつぶさ
れます.
>> stem(n,x,’filled’);
plot と同じオプションによりラインやマーカーの種類を指定することも
できます.
71