15
5 いろいろなグラフ この章ではさまざまなグラフについて紹介します.3 次元のラインプロッ トやサーフェスプロット,棒グラフや円グラフなどを紹介します.これら を使えば,レポートやプレゼンテーションで多彩な表現ができます. とはいえ,豊富なグラフ機能の全てを紹介することはとてもできませ ん.使いこなしたい方はぜひ一度マニュアルに目を通されることをお勧め します.そして,自分なりの使い方を開発してください. copyright c 2004 Tatsuya Kitamura / All rights reserved. 57

第5章 いろいろなグラフ - konan-u.ac.jp · 第5章 いろいろなグラフ 図5.2には陰線処理が施されていますが,MATLABでは図5.3 のよう にhiddenMAT

Embed Size (px)

Citation preview

第5章 いろいろなグラフ

この章ではさまざまなグラフについて紹介します.3次元のラインプロットやサーフェスプロット,棒グラフや円グラフなどを紹介します.これらを使えば,レポートやプレゼンテーションで多彩な表現ができます.とはいえ,豊富なグラフ機能の全てを紹介することはとてもできません.使いこなしたい方はぜひ一度マニュアルに目を通されることをお勧めします.そして,自分なりの使い方を開発してください.

copyright c© 2004 Tatsuya Kitamura / All rights reserved.

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’);

−30−20

−100

1020

3040

−30

−20

−10

0

10

20

300

5

10

15

20

25

30

35

XY

Z

図 5.1: plot3 の実行例

3次元のグラフでもラベル,タイトル,凡例を付けることができます.axis で表示範囲を指定することもできます.

5.2 3次元のサーフェスプロット

3次元のサーフェスプロット(surface plot)のための代表的なコマンドは mesh と surfMAT です.mesh はOctaveにもあります.

1川原稔, “gnuplot パーフェクト・マニュアル”, ソフトバンク (1999).

58

5.2. 3次元のサーフェスプロット

MATLABには 3次元プロットのデモに便利な peaksMAT が用意されています.このコマンドで得られる行列を mesh でプロットしたものを図 5.2に示します.あわせて colorbarMAT でカラーバーも表示させました.

>> z=peaks;

>> mesh(z)

>> grid on; colorbar

−6

−4

−2

0

2

4

6

8

010

2030

4050

0

10

20

30

40

50−8

−6

−4

−2

0

2

4

6

8

10

図 5.2: mesh の実行例.

プロットのカラーマップは colormapで変更することができます.現時点のカラーマップは

>> map=colormap;

で得ることができます.カラーマップはRBGで表され,赤,緑,青の強さを 0 から 1の間の値で表します.デフォルトのカラーマップに戻すには次のようにします.

>> colormap(’default’)

59

第 5章 いろいろなグラフ

図 5.2には陰線処理が施されていますが,MATLABでは図 5.3 のように hiddenMAT を使ってこれを外すこともできます.

>> hidden off

−6

−4

−2

0

2

4

6

8

010

2030

4050

0

10

20

30

40

50−8

−6

−4

−2

0

2

4

6

8

10

図 5.3: 陰線処理を外した状態.

meshcMAT を使うと図 5.4のようにコンタープロット(contour plot)もあわせて表示されます.以下の例では,カラーバーを水平方向に付けるコマンドです.

>> meshc(z); grid on

>> colorbar(’horiz’)

−6 −4 −2 0 2 4 6 8

010

2030

4050

0

10

20

30

40

50−10

−5

0

5

10

図 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’);

0

20

40

60

0

20

40

60

−8

−6

−4

−2

0

2

4

6

8

10

surf

0

20

40

60

0

20

40

60

−10

−5

0

5

10

surfc

図 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 − y2という関数をプロットしてみます.xと yの範囲は−5~5とします.まず,meshgrid によって X–Y平面上の座標を表す行列 x,y を作り

ます.

>> [x,y]=meshgrid(-5:5);

スペースの関係でここには載せませんが,読者のみなさんはぜひ x と y

の値を確認してください.次に,z = x2−y2を計算します.以下の例では,zを求める際 .^を用い

ることで行列演算として計算しています.これはベクトル化(vectorize)と呼ばれる手法の 1つです.ベクトル化については後の章で詳しく説明します.

>> z=x.^2-y.^2;

>> mesh(z)

>> grid on

>> box on

最後の box は図に箱の枠を表示させるコマンドです.こうして得られたグラフを図 5.6に示します.

02

46

810

12

0

2

4

6

8

10

12−30

−20

−10

0

10

20

30

図 5.6: z = x2 − y2のグラフ.

♣ 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 Graph-ics”中の図を改変.

POINT 極座標系による視点の設定 MATLABの場合:

view(俯角,仰角) または view([俯角,仰角])

Octaveの場合:(俯角は 0~180,仰角は 0~360の範囲)

gset view 俯角,仰角

MATLABの 3次元グラフでは,俯角は−37.5,仰角は 30がデフォルトです.view によって現在の視点を知ることができます.

>> [az,el]=view;

azに俯角,el に仰角が入ります.Octaveの 3次元グラフでは俯角が 60,仰角は30がデフォルトです.Octaveで現在の視点を知るには gshow view

を実行します.

2MATLABでは view([X Y Z]) として直交座標系で視点を指定することもできます.

63

第 5章 いろいろなグラフ

view を使って視点を変えてみましょう.少し上からの視点にするために仰角を 60にしてデフォルトの視点と比較した図を 図 5.8に示します.

>> z=membrane;

>> mesh(z)

>> view(-37.5,60)

membraneMAT はMathworksのロゴとして使われている 3次元グラフのデータを出力するコマンドです.

0

10

20

30

40

0

10

20

30

40

−0.4

−0.2

0

0.2

0.4

0.6

0.8

1

view(−37.5,30)

0

10

20

30

40

0

10

20

30

40

−0.5

0

0.5

1

view(−37.5,60)

図 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

0 2 4 6 8 100

200

400

600

800

1000

1200plot

0 2 4 6 8 1010

0

101

102

103

104

semilogy

100

101

0

200

400

600

800

1000

1200semilogx

100

101

100

101

102

103

104

loglog

図 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 で設定できます.

1 2 3 4 50

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

1bar

0 0.2 0.4 0.6 0.8 1

1

2

3

4

5

barh

図 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に示します.

1 2 3 4 50

0.5

1

1.5

2

2.5stack

0

0.5

1

1

2

3

4

5

bar3h

図 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

−4 −2 0 2 40

500

1000

1500

2000

2500

3000randn(10000,1)

0 0.2 0.4 0.6 0.8 10

200

400

600

800

1000

1200rand(10000,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%

17%

16%

34%

14%

16%sd0a

sd0f

sd0d

sd0e

sd0g

sd0h

図 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に示します.

0 1 2 3 4 5 6 7 8 9 10−0.8

−0.6

−0.4

−0.2

0

0.2

0.4

0.6

0.8

1x[n] = αn cos(Ω n)

n

x[n]

図 5.15: x[n] = αn cos(Ωn) のグラフ.

次のように filled オプションを指定すると,マーカー内が塗りつぶされます.

>> stem(n,x,’filled’);

plot と同じオプションによりラインやマーカーの種類を指定することもできます.

71