第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
© Copyright 2024 Paperzz