大変お待たせいたしました。MATLABプロットに関する詳細な記事を執筆しました。約5000語というご指定のボリュームを達成するため、各セクションを深く掘り下げ、具体的なコード例と詳細な解説を豊富に含んでいます。
初めてのMATLAB Plot!簡単なステップで綺麗なグラフを描く方法
はじめに:データ可視化の強力な武器、MATLABプロット
科学技術計算、データ分析、シミュレーションといった分野で、MATLABは世界中の研究者やエンジニアに愛用されている強力なツールです。その中でも特に重要な機能の一つが「プロット(Plot)」、つまりデータのグラフ化です。数値データが羅列された表を見るだけではなかなか気づけない傾向やパターンも、グラフとして視覚化することで一目瞭然となります。論文発表、研究報告、設計レビューなど、あらゆる場面で「美しく、そして正確な」グラフは、あなたのアイデアや発見を効果的に伝えるための不可欠な要素となります。
しかし、「MATLABでグラフを描くのは難しそう」「コマンドがたくさんあって覚えられない」と感じる方もいるかもしれません。ご安心ください。MATLABのプロット機能は非常に強力でありながら、その基本的な使い方は驚くほどシンプルです。この記事では、MATLABを初めて使う方でも、基本的な2Dグラフから、少し凝ったカスタマイズ、さらには3Dグラフまで、一歩ずつ着実に習得できるよう、具体的なコード例と詳細な解説を交えながら徹底的にガイドします。
最終的には、ただグラフを描くだけでなく、学会発表や論文投稿にも耐えうる「綺麗な」グラフを作成するための秘訣まで、余すことなくお伝えします。さあ、MATLABでのデータ可視化の旅に出かけましょう!
第1章:MATLABプロットの基本中の基本
この章では、MATLABで最も基本的なプロットコマンドであるplot
関数を使い、最初のグラフを描くことから始めます。プロットの最も基本的な要素であるデータ、軸、タイトル、凡例の設定方法を学びましょう。
1.1. 最初のグラフを描く:plot
関数の導入
MATLABでグラフを描く最も基本的な関数はplot
です。この関数は、与えられた数値データを2次元平面上に点や線として描画します。
1.1.1. 1次元データをプロットする:plot(y)
最もシンプルな形式は、1つの数値ベクトルをplot
関数に渡す場合です。この場合、MATLABはベクトルの各要素をY軸の値として、そのインデックス(要素の順番)をX軸の値として自動的にプロットします。
例1-1: シンプルな波形プロット
“`matlab
% 例1-1: シンプルな波形プロット
% 0から2πまでの範囲で200個の点を生成
x = linspace(0, 2*pi, 200);
% cos関数の値を計算
y = cos(x);
% y値をプロット(X軸は自動的にインデックスになる)
plot(y);
% プロット結果の確認:
% MATLABのFigureウィンドウに、X軸が1から200まで、Y軸が-1から1までのコサイン波形が表示されます。
% この形式は手軽ですが、X軸が意味を持つデータである場合は、次項のようにX軸も明示的に指定することが推奨されます。
“`
解説:
* linspace(0, 2*pi, 200)
: この関数は、指定された開始値(0
)と終了値(2*pi
、約6.2832)の間に、指定された数の等間隔な点(200
個)を生成し、それらをベクトルx
に格納します。これはX軸のデータとして使用されます。
* y = cos(x)
: x
ベクトルの各要素(角度)に対してコサイン関数を適用し、対応するY軸のデータy
を計算します。MATLABの関数は、通常、ベクトルや行列の要素ごとに操作を実行する「要素ごとの演算」を自動的に行います。
* plot(y)
: ここではYデータのみをplot
関数に渡しています。MATLABは賢く、y
のインデックス(最初の要素は1、2番目の要素は2、…、200番目の要素は200)を自動的にX軸の値として使用し、y
の値をY軸としてプロットします。結果としてコサイン波形が表示されますが、X軸の物理的な意味はインデックス(点の数)となります。
1.1.2. 2次元データをプロットする:plot(x, y)
最も一般的で推奨されるplot
関数の使用方法は、X軸とY軸のデータをそれぞれベクトルとして渡す形式です。これにより、X軸の値を自由に設定でき、データが持つ物理的な意味を直接グラフに反映させることができます。
例1-2: X軸とY軸を指定したプロット
“`matlab
% 例1-2: X軸とY軸を指定したプロット
x = linspace(0, 2*pi, 200); % 0から2πまでのX軸データ(角度)
y = cos(x); % 対応するY軸データ(コサイン値)
plot(x, y); % xとyを指定してプロット
% プロット結果の確認:
% Figureウィンドウに、X軸が0から2π(約6.28)まで、Y軸が-1から1までのコサイン波形が描画されます。
% X軸が物理的な意味を持つデータ(例:時間、周波数、距離など)である場合に、この形式が非常に有効です。
“`
解説:
* plot(x, y)
: x
ベクトルとy
ベクトルを引数として渡します。MATLABはx
の1番目の要素とy
の1番目の要素を組み合わせて最初の点(x(1)
, y(1)
)とし、以下同様に全ての対応する点をプロットします。そして、デフォルトではこれらのプロットされた点を線で結びます。この方法により、X軸が時間や角度といった実際の物理量を表す場合に、グラフがより直感的になります。
1.1.3. 線のスタイル、色、マーカーの指定
plot
関数は、描画される線の色、種類(線種)、そしてデータ点を表すマーカーの種類を簡単に指定するための引数を受け付けます。これはLineSpec
(ライン指定子)と呼ばれ、簡潔な文字列で表現されます。
基本的なLineSpec
の形式: 'カラー指定子' '線種指定子' 'マーカー指定子'
これらの指定子は、個別に指定することも、組み合わせて指定することもできます。任意の順序で記述できますが、通常は読みやすさのためにカラー、線種、マーカーの順に記述します。
- カラー指定子 (Color Specifiers): グラフの色を指定します。
'r'
(赤),'g'
(緑),'b'
(青),'c'
(シアン),'m'
(マゼンタ),'y'
(黄),'k'
(黒),'w'
(白)
- 線種指定子 (Line Style Specifiers): 線の種類を指定します。
'-'
(実線),'--'
(破線),':'
(点線),'-.'
(一点鎖線)
- マーカー指定子 (Marker Specifiers): データ点の形状を指定します。
'o'
(円),'+'
(プラス),'*'
(アスタリスク),'.'
(点),'x'
(バツ),'s'
(四角),'d'
(ひし形),'^'
(上向き三角形),'v'
(下向き三角形),'>'
(右向き三角形),'<'
(左向き三角形),'p'
(五角形),'h'
(六角形)
例1-3: 線のスタイル、色、マーカーを指定したプロット
“`matlab
% 例1-3: 線のスタイル、色、マーカーを指定したプロット
x = 0:0.5:10; % 0から10まで0.5刻みでX軸データ(離散的な点が分かりやすいように刻みを大きく設定)
y1 = sin(x);
% 赤色の破線で円マーカーを使用
plot(x, y1, ‘r–o’);
% プロット結果の確認:
% y1のプロットが赤色の破線で描かれ、各データ点(0.5刻みでプロットされた点)に円マーカーが表示されます。
% これにより、線の形状だけでなく、データ点そのものの位置も明確に視覚化できます。
“`
解説:
* 'r--o'
: この文字列は、カラー指定子'r'
(赤色)、線種指定子'--'
(破線)、マーカー指定子'o'
(円形マーカー)を組み合わせたものです。MATLABは、これらの指定子を解析して、対応する線の見た目を設定します。
1.1.4. 複数データを1つのグラフにプロットする
1つのFigure(図)ウィンドウ内に複数のデータセットを重ねて描画することで、異なるデータの比較を容易に行うことができます。MATLABには、このためのいくつかの便利な方法があります。
方法1: 複数のx, y
ペアをplot
関数に渡す
この方法は、複数の線を一度に描画する最も簡潔な方法です。plot(x1, y1, LineSpec1, x2, y2, LineSpec2, ...)
のように、データセットとそれに対応するLineSpec
のペアを続けてplot
関数に渡します。
例1-4: 複数データをまとめてプロット
“`matlab
% 例1-4: 複数データをまとめてプロット
x = linspace(0, 2pi, 100); % 0から2πまでのX軸データ
y1 = sin(x); % サイン波
y2 = cos(x); % コサイン波
y3 = sin(2x); % 周波数が2倍のサイン波
% 1回のplot関数呼び出しで3つの線をプロット
plot(x, y1, ‘b-‘, … % 青い実線のサイン波
x, y2, ‘r–‘, … % 赤い破線のコサイン波
x, y3, ‘g:’); % 緑の点線の周波数2倍サイン波
% プロット結果の確認:
% 1つのグラフに、青い実線のsin(x)、赤い破線のcos(x)、緑の点線のsin(2x)が重ねて描画されます。
% それぞれの線が異なる色と線種で表現されるため、視覚的に区別しやすくなります。
“`
方法2: hold on
とhold off
を使う
plot
関数を一度呼び出して最初の線を描画した後、hold on
コマンドを使うと、その後に続くplot
関数呼び出しが新しいグラフを作成する代わりに、既存のグラフに重ねて追加されていきます。グラフへの追加を止めたい場合はhold off
を使用します。
例1-5: hold on
/hold off
を使った複数プロット
“`matlab
% 例1-5: hold on/hold offを使った複数プロット
x = linspace(0, 2*pi, 100);
y1 = sin(x);
y2 = cos(x);
plot(x, y1, ‘b-‘); % 最初のプロット:青い実線のサイン波
hold on; % これ以降のプロットは既存のグラフに追加されるモードに設定
plot(x, y2, ‘r–‘); % 2つ目のプロットを追加:赤い破線のコサイン波
hold off; % holdモードを終了。これ以降のplotコマンドは新しいFigureウィンドウを作成します。
% プロット結果の確認:
% sin(x)とcos(x)が同じグラフに重ねて描画されます。
% hold offの後にplotを呼び出すと、新しいウィンドウが開いてそこにグラフが描かれます。
“`
使い分けのヒント:
* 方法1 (plot(x1,y1,x2,y2,...)
): 複数のデータセットが相互に関連しており、まとめて描画する方がコードが簡潔になる場合に特に適しています。例えば、複数の異なる特性を持つ同一種類のデータを比較する際などに便利です。
* 方法2 (hold on/off
): データが異なる段階で生成される場合や、複雑なアルゴリズムの途中で段階的にプロットを追加していく場合、あるいは既存のプロットに後からデータを追加したい場合に柔軟性があります。特に、ループ処理でデータを順次プロットしていくような場面で便利で、可読性が向上します。
1.2. 軸とタイトルの設定:グラフを読み解きやすく
グラフはただデータが描かれていれば良いというものではありません。それが何を表しているのか、どこからどこまでの範囲なのか、といった情報が読み手に明確に伝わるようにする必要があります。そのために、タイトル、軸ラベル、凡例、グリッド線などの要素を設定し、グラフの情報を補完します。
1.2.1. グラフのタイトルを設定する:title
グラフ全体の主題やテーマを示すために、title
関数を使用します。これにより、グラフが何を表現しているのかを一目で理解できます。
例1-6: タイトルを追加
“`matlab
% 例1-6: タイトルを追加
x = linspace(0, 10, 50); % X軸データ
y = exp(-x/2) . sin(3x); % 減衰する正弦波のデータ
plot(x, y);
title(‘減衰する正弦波’); % グラフにタイトルを追加
% プロット結果の確認:
% Figureウィンドウのグラフ上部中央に「減衰する正弦波」というタイトルが表示されます。
“`
1.2.2. X軸とY軸のラベルを設定する:xlabel
, ylabel
各軸が何の物理量やカテゴリを表しているのかを示すために、xlabel
(X軸ラベル)とylabel
(Y軸ラベル)関数を使用します。単位も併記することで、グラフの情報をより正確に伝達できます。
例1-7: 軸ラベルを追加
“`matlab
% 例1-7: 軸ラベルを追加
x = linspace(0, 10, 50);
y = exp(-x/2) . sin(3x);
plot(x, y);
title(‘減衰する正弦波’);
xlabel(‘時間 [秒]’); % X軸ラベル
ylabel(‘振幅 [単位なし]’); % Y軸ラベル
% プロット結果の確認:
% X軸の下に「時間 [秒]」、Y軸の左側に「振幅 [単位なし]」というラベルが表示されます。
% これにより、グラフが表す物理的な意味が明確になります。
“`
1.2.3. 凡例(レジェンド)を追加する:legend
複数の線が描かれているグラフの場合、それぞれが何を表しているのかを区別するために凡例(legend)が不可欠です。plot
関数で線をプロットした順に、凡例に表示したい文字列をlegend
関数に渡します。
例1-8: 凡例を追加
“`matlab
% 例1-8: 凡例を追加
x = linspace(0, 2*pi, 100);
y1 = sin(x);
y2 = cos(x);
plot(x, y1, ‘b-‘, x, y2, ‘r–‘); % 2本の線をプロット
title(‘サイン波とコサイン波の比較’);
xlabel(‘角度 [rad]’);
ylabel(‘値’);
legend(‘sin(x)’, ‘cos(x)’); % 凡例を追加。plot関数の引数順に対応。
% プロット結果の確認:
% グラフのデフォルト位置(通常は右上)に凡例ボックスが表示され、「sin(x)」が青い実線、「cos(x)」が赤い破線と関連付けられます。
“`
凡例の位置調整:
legend
関数には、凡例ボックスの表示位置を指定するための引数を追加することができます。これにより、凡例がグラフの重要なデータ部分と重ならないように調整できます。
'northwest'
(左上),'northeast'
(右上),'southwest'
(左下),'southeast'
(右下)'best'
(MATLABが自動で最適な位置を探す),'Location', 'none'
(凡例ボックスを生成し、ユーザーがマウスで自由にドラッグして配置できる)
例1-9: 凡例の位置を指定
“`matlab
% 例1-9: 凡例の位置を指定
x = linspace(0, 2*pi, 100);
y1 = sin(x);
y2 = cos(x);
plot(x, y1, ‘b-‘, x, y2, ‘r–‘);
title(‘サイン波とコサイン波の比較’);
xlabel(‘角度 [rad]’);
ylabel(‘値’);
legend(‘sin(x)’, ‘cos(x)’, ‘Location’, ‘southwest’); % 凡例をグラフの左下隅に配置
% ‘Location’, ‘best’ もよく使われます。
“`
1.2.4. グリッド線を追加する:grid on
/grid off
グラフの値をより正確に読み取ったり、点の位置を把握しやすくするために、グリッド線(方眼線)を背景に表示することができます。
例1-10: グリッド線を追加
“`matlab
% 例1-10: グリッド線を追加
x = linspace(0, 10, 50);
y = exp(-x/2) . sin(3x);
plot(x, y);
title(‘減衰する正弦波’);
xlabel(‘時間 [秒]’);
ylabel(‘振幅 [単位なし]’);
grid on; % グリッド線を表示
% プロット結果の確認:
% グラフに縦横のグリッド線が追加されます。これにより、各点のX,Y値を読み取りやすくなります。
% グリッド線を非表示にしたい場合は grid off;
とします。
“`
1.3. プロットウィンドウの操作
MATLABのFigureウィンドウには、グラフを対話的に操作するための豊富なツールが標準で用意されています。これらのツールを使うことで、コードを修正することなく、グラフの特定の領域を拡大したり、パン(移動)したり、個々のデータ点を調べたりすることができます。
Figureウィンドウの上部にあるツールバーには、以下のようなアイコンがあります(MATLABのバージョンによってアイコンの見た目は異なる場合があります)。
- ズームイン/ズームアウト (虫眼鏡アイコン): グラフの特定の領域を長方形で選択して拡大したり、クリックでズームイン/ズームアウトしたりします。データの詳細な部分を調べる際に便利です。
- パン (手のひらアイコン): グラフをドラッグして表示領域を移動させます。拡大表示している際に、異なる部分を見たい場合に役立ちます。
- データチップ (矢印に十字アイコン): プロット上のデータ点にマウスカーソルを合わせると、その点のX, Y座標値をポップアップ表示します。特定のデータ点の正確な値を知りたい場合に便利です。
- プロットツール (矢印に歯車アイコン): このボタンをクリックすると、「プロットツール」という別のウィンドウが開きます。これは、プロット全体のプロパティ(軸の範囲、フォント、線の色など)をGUI(グラフィカルユーザーインターフェース)で編集できる非常に強力なツールです。後述する「プロパティインスペクタ」と密接に関連します。
- ブラシツール (ブラシアイコン): 散布図などで特定のデータ点を選択し、ハイライトしたり、そのプロパティを変更したりするのに使います。データの外れ値などを視覚的に特定するのに役立ちます。
これらのツールは、コードを書くことなく、一時的にグラフの表示を変更したり、特定のデータ点を調べたりするのに非常に便利です。ただし、これらの対話的な変更は、Figureファイルを.fig
形式で保存しない限り、MATLABセッションを終了すると失われます。恒久的な変更や、自動化されたレポート作成のためには、次章以降で解説するコードでプロパティを設定する方法を学ぶ必要があります。
第2章:グラフを「美しく」する秘訣 – 装飾とカスタマイズ
ただ情報が伝わるだけでなく、「綺麗でプロフェッショナルな」グラフを作成するためには、より詳細なカスタマイズが必要です。この章では、線やマーカーの見た目を細かく調整したり、軸の目盛りやフォントを変更したり、さらに複雑な注釈を追加する方法を学びます。これらのテクニックを習得することで、あなたのグラフは単なるデータの羅列から、視覚的に魅力的で、かつ説得力のある情報伝達ツールへと進化します。
2.1. 線のスタイル、色、マーカーの詳細設定
第1章で基本的なLineSpec
(例: 'r--o'
)を使って線の見た目を設定しましたが、MATLABはこれよりもはるかに詳細なプロパティを通じて、線の色、太さ、マーカーのサイズや色などを個別に制御する機能を提供しています。これらのプロパティは、plot
関数の引数として直接'PropertyName', Value
のペアで渡すか、あるいは後述する「ハンドルグラフィックス」を用いて設定することができます。
主要なプロパティ:
'Color'
:線の色を指定します。RGB値(例:[R G B]
、各成分は0から1)、またはHEXコード(例:'#FF0000'
)で指定すると、より自由な色選択が可能です。'LineStyle'
:線の種類を指定します。'-'
(実線),'--'
(破線),':'
(点線),'-.'
(一点鎖線),'none'
(線なし)などがあります。'LineWidth'
:線の太さを指定します。単位はポイント(pt)です。通常、論文や発表資料では1.0〜2.0pt程度がよく使われます。'Marker'
:マーカーの種類を指定します。'o'
(円),'s'
(四角),'^'
(上向き三角形)など、第1章で挙げたものに加えて'none'
(マーカーなし)も指定できます。'MarkerSize'
:マーカーのサイズを指定します。単位はポイントです。'MarkerEdgeColor'
:マーカーの縁の色を指定します。'MarkerFaceColor'
:マーカーの内部(塗りつぶし部分)の色を指定します。'auto'
を設定すると、線の色と同じになります。'none'
を設定すると塗りつぶされません。
例2-1: 詳細な線とマーカーのカスタマイズ
“`matlab
% 例2-1: 詳細な線とマーカーのカスタマイズ
x = 0:0.1:2pi;
y = sin(x) + randn(size(x))0.2; % ノイズを加えたサイン波。データ点を見やすくするため。
plot(x, y, …
‘Color’, [0.85 0.325 0.098], … % オレンジ系のRGB値 (MATLABの標準カラーの一つ)
‘LineStyle’, ‘-‘, … % 実線
‘LineWidth’, 1.5, … % 線の太さを1.5ポイントに設定
‘Marker’, ‘o’, … % マーカーは円形
‘MarkerSize’, 6, … % マーカーサイズを6ポイントに設定
‘MarkerEdgeColor’, ‘b’, … % マーカーの縁を青色に
‘MarkerFaceColor’, [0.5 0.5 0.5]); % マーカー内部をグレーに塗りつぶし
title(‘ノイズ入りサイン波の詳細カスタマイズ’);
xlabel(‘X軸’);
ylabel(‘Y軸’);
grid on;
% プロット結果の確認:
% グラフの線が指定したオレンジ色で太さ1.5ptの実線になり、各データ点に青い縁とグレーの内部を持つ円形マーカーが表示されます。
% これにより、線の強調や、個々のデータ点の視認性を向上させることができます。
“`
解説:
* 'Color', [0.85 0.325 0.098]
: RGB値は0から1の範囲で赤、緑、青の成分をそれぞれ指定します。この表記を使うことで、MATLABの標準カラーパレットにない特定の色を正確に指定できます。また、Webカラーコード(HEX値)も使用可能です(例: '#FF0000'
は赤)。
* 'LineWidth', 1.5
: 線の太さを数値で指定します。論文などで印刷することを考えると、線の太さは非常に重要です。細すぎると見えにくく、太すぎると線が重なったときに情報が失われる可能性があります。
* 'MarkerEdgeColor', 'b'
, 'MarkerFaceColor', [0.5 0.5 0.5]
: マーカーの縁の色と内部の色を別々に指定できます。これは散布図などで複数のカテゴリを表現する際に特に効果的です。例えば、カテゴリによって縁の色を変えたり、塗りつぶしの色を変えたりすることができます。
2.2. 軸のカスタマイズ
軸はグラフの骨格であり、その設定はグラフの読みやすさに直結します。表示範囲、目盛り(ティックマーク)の位置とラベル、軸ラベルのフォントなどを細かく調整することで、グラフのメッセージをより明確に伝えることができます。
2.2.1. 軸の範囲を設定する:xlim
, ylim
, axis
デフォルトでは、MATLABはプロットされたデータに基づいて最適な軸の表示範囲を自動的に決定します。しかし、特定の範囲に限定したり、複数のグラフ間で比較するために同じ範囲に揃えたりしたい場合があります。
xlim([xmin xmax])
: X軸の表示範囲をxmin
からxmax
までに設定します。ylim([ymin ymax])
: Y軸の表示範囲をymin
からymax
までに設定します。axis([xmin xmax ymin ymax])
: X軸とY軸の両方の表示範囲を一度に設定します。axis('tight')
: プロットされた全てのデータ点を含むように、軸の範囲をデータにぴったり合うように自動調整します。余白を最小限に抑えたい場合に便利です。axis('equal')
: X軸とY軸のデータ単位あたりの長さを同じにします。これにより、正方形を描画すると本当に正方形に見えるようになります。地図や幾何学的な図形をプロットする際に重要です。axis('square')
: Figureのプロット領域自体を正方形にします。axis('equal')
とは異なり、軸のスケールではなく、プロット領域の物理的な縦横比を調整します。axis('auto')
: 軸の範囲をMATLABの既定値(データに基づいて自動調整)に戻します。
例2-2: 軸の範囲を設定
“`matlab
% 例2-2: 軸の範囲を設定
x = linspace(0, 10, 100);
y = sin(x);
plot(x, y);
title(‘X軸Y軸の範囲設定’);
xlabel(‘X’);
ylabel(‘Y’);
% Y軸の範囲を -0.5 から 0.5 に設定
ylim([-0.5 0.5]);
% X軸の範囲を 2 から 8 に設定
xlim([2 8]);
grid on;
% プロット結果の確認:
% サイン波全体ではなく、Xが2から8、Yが-0.5から0.5の範囲のサイン波の一部だけが表示されます。
% これにより、特定の関心領域に焦点を当てることができます。
“`
2.2.2. ティックマークとラベルのカスタマイズ:xticks
, yticks
, xticklabels
, yticklabels
軸の目盛り(ティックマーク)とそのラベルは、グラフの値を読み取る上で非常に重要です。MATLABは自動で目盛りを配置しますが、より詳細な制御が可能です。
xticks(values)
: X軸の主目盛りの位置をvalues
ベクトルで指定します。values
は、X軸上に表示したい目盛りの座標を昇順に並べたベクトルです。yticks(values)
: Y軸の主目盛りの位置をvalues
ベクトルで指定します。xticklabels(labels)
: X軸の目盛りラベルを文字列セル配列labels
で指定します。labels
の各要素は、xticks
で指定した位置に対応するラベル文字列です。yticklabels(labels)
: Y軸の目盛りラベルを文字列セル配列labels
で指定します。
例2-3: ティックマークとラベルのカスタマイズ
“`matlab
% 例2-3: ティックマークとラベルのカスタマイズ
angles = linspace(0, 2*pi, 100);
y = sin(angles);
plot(angles, y);
title(‘角度とサイン波’);
ylabel(‘値’);
grid on;
% X軸のティックマークをπの倍数で設定
xticks([0 pi/2 pi 3pi/2 2pi]);
% X軸のラベルを数式で設定 (LaTeXインタープリタを使用する場合は、後述の'Interpreter'
を設定)
% ここでは、単純な文字列として表示します。
xticklabels({‘0’, ‘pi/2’, ‘pi’, ‘3pi/2’, ‘2pi’});
% Y軸のティックマークを特定の整数値で設定
yticks([-1 -0.5 0 0.5 1]);
% Y軸のラベルをカスタム文字列で設定
yticklabels({‘最小’, ‘-0.5’, ‘0’, ‘0.5’, ‘最大’});
% プロット結果の確認:
% X軸の目盛りがπの倍数になり、それに合わせたカスタムラベルが表示されます。
% Y軸の目盛りもカスタム設定された位置とラベルになります。これにより、データがより意味的に解釈できるようになります。
“`
ヒント: xtickformat
やytickformat
を使うと、数値のフォーマットを簡単に変更できます(例: xtickformat('%.1f')
で小数点以下1桁表示)。これは、数値ラベルの表示を制御するのに非常に便利です。
2.2.3. 対数軸プロット:semilogx
, semilogy
, loglog
データが広い範囲にわたる場合や、指数関数的な関係を持つ場合に、対数軸を使うとデータの特徴や線形関係がより明確になります。
semilogx(x, y)
: X軸が対数スケール、Y軸が線形スケールsemilogy(x, y)
: X軸が線形スケール、Y軸が対数スケールloglog(x, y)
: X軸、Y軸ともにが対数スケール
例2-4: 対数軸プロット
“`matlab
% 例2-4: 対数軸プロット
x = logspace(0, 3, 100); % 10^0 (1) から10^3 (1000) まで対数的に分布する100個の点
y = x.^2; % y = x^2 という関係
figure; % 新しいFigureウィンドウを作成
subplot(1,2,1); % 1行2列のグリッドの1番目のサブプロット(左)
plot(x, y);
title(‘線形スケール: y = x^2’);
xlabel(‘X’);
ylabel(‘Y’);
grid on;
subplot(1,2,2); % 1行2列のグリッドの2番目のサブプロット(右)
loglog(x, y); % 両軸を対数スケールでプロット
title(‘対数スケール (loglog): log(y) = 2 log(x)’);
xlabel(‘X (log scale)’);
ylabel(‘Y (log scale)’);
grid on;
% プロット結果の確認:
% 左のグラフは通常の放物線(y = x^2)が表示されます。
% 右のグラフでは、loglogプロットによってy = x^2 の関係が直線(log(y) = 2 log(x))に見えます。
% これは、指数関数的な変化やべき乗則を示すデータに特に有効です。
“`
2.2.4. 軸のフォント、サイズ、太字
論文やプレゼンテーションでは、軸ラベルやティックラベル(目盛りラベル)のフォント設定も、グラフのプロフェッショナリズムと可読性に大きく影響します。
'FontSize'
:フォントサイズ (ポイント単位)'FontWeight'
:フォントの太さ ('normal'
(標準) or'bold'
(太字))'FontName'
:フォントの種類 (例:'Arial'
,'Times New Roman'
,'Meiryo'
)'Color'
:テキストの色
これらのプロパティは、xlabel
, ylabel
, title
, legend
関数に直接引数として渡すか、あるいは後述する「プロットオブジェクトのハンドル」を使って設定します。
例2-5: 軸ラベルのフォントカスタマイズ
“`matlab
% 例2-5: 軸ラベルのフォントカスタマイズ
x = 1:10;
y = x.^1.5;
plot(x, y, ‘b-o’); % 線とマーカーも少し設定
% タイトルにカスタムフォントとサイズ、太字設定
title(‘カスタムフォントのグラフ’, ‘FontSize’, 16, ‘FontWeight’, ‘bold’, ‘Color’, [0.1 0.1 0.1]);
% X軸ラベルにカスタムフォント、サイズ、太字、色設定
xlabel(‘独立変数 X’, ‘FontSize’, 12, ‘FontWeight’, ‘bold’, ‘FontName’, ‘Times New Roman’, ‘Color’, [0 0.5 0]);
% Y軸ラベルにカスタムフォント、サイズ、太字、色設定
ylabel(‘従属変数 Y’, ‘FontSize’, 12, ‘FontWeight’, ‘bold’, ‘FontName’, ‘Times New Roman’, ‘Color’, [0.7 0 0]);
grid on;
% 軸の目盛りラベル(ティックラベル)のフォントサイズも変更する場合
% まず、現在のAxesオブジェクトのハンドルを取得します
ax = gca;
ax.FontSize = 10; % 目盛りラベルのフォントサイズを変更
ax.FontWeight = ‘bold’; % 目盛りラベルを太字に
ax.FontName = ‘Arial’; % 目盛りラベルのフォント種類も変更
% プロット結果の確認:
% タイトル、軸ラベルのフォントサイズ、太さ、色、種類が指定通りに変更されます。
% 軸の目盛りラベルも太字かつ指定されたフォントになります。
% これにより、プレゼンテーションや論文での見栄えが向上します。
“`
2.3. タイトルと凡例の強化
タイトルと凡例も、軸と同様に詳細な設定が可能です。特にLaTeXインタプリタの使用は、数式を含むプロフェッショナルなグラフを作成する上で非常に強力な機能です。
2.3.1. フォント、サイズ、位置の調整
基本的な設定方法は軸ラベルと同様で、対応する関数(title
, legend
)にプロパティと値のペアを引数として渡します。
例2-6: タイトルと凡例のフォントカスタマイズ
“`matlab
% 例2-6: タイトルと凡例のフォントカスタマイズ
x = linspace(0, 2*pi, 100);
y1 = sin(x);
y2 = cos(x);
plot(x, y1, ‘Color’, [0 0.447 0.741], ‘LineWidth’, 1.2); % MATLAB標準青色
hold on;
plot(x, y2, ‘Color’, [0.850 0.325 0.098], ‘LineStyle’, ‘–‘, ‘LineWidth’, 1.2); % MATLAB標準オレンジ色
hold off;
% タイトルのカスタマイズ
title(‘波形比較:サイン波とコサイン波’, ‘FontSize’, 16, ‘FontWeight’, ‘bold’, ‘Color’, ‘k’);
% 軸ラベルのカスタマイズ (例2-5と同様のスタイルで)
xlabel(‘角度 (rad)’, ‘FontSize’, 12, ‘FontWeight’, ‘bold’);
ylabel(‘振幅’, ‘FontSize’, 12, ‘FontWeight’, ‘bold’);
% 凡例のカスタマイズ
legend(‘sin(x)’, ‘cos(x)’, ‘Location’, ‘best’, ‘FontSize’, 10, ‘FontWeight’, ‘bold’, ‘Box’, ‘off’);
% ‘Box’, ‘off’ で凡例の枠線を非表示にできます。
grid on;
% プロット結果の確認:
% タイトルと凡例が指定したフォント、サイズ、太字で表示され、凡例の枠線がなくなります。
% これらの調整は、グラフの「美しさ」と「情報の伝達効率」を向上させます。
“`
2.3.2. LaTeXインタープリタの使用
MATLABのテキスト要素(タイトル、軸ラベル、凡例、テキスト注釈)では、文字列の解釈方法を指定できます。'Interpreter'
プロパティを'latex'
に設定すると、文字列内でLaTeXの数式コマンドを使用できるようになります。これにより、非常に高品質で、出版物にも耐えうる美しい数式をグラフ内に表示できます。
'Interpreter', 'latex'
- インライン数式は
$
記号で囲む(例:$\alpha^2$
)。 - 独立した数式ブロック(ディスプレイ数式)は
$$
記号で囲む。ただし、プロット内のテキストでは通常インライン数式が使われます。
例2-7: LaTeXを使った数式表示
“`matlab
% 例2-7: LaTeXを使った数式表示
x = linspace(0, 2*pi, 100);
y1 = sin(x);
y2 = cos(x);
plot(x, y1, ‘b-‘, x, y2, ‘r–‘);
% タイトルにLaTeX数式を使用
title(‘波形比較:$\sin(\theta)$ と $\cos(\theta)$’, ‘Interpreter’, ‘latex’, ‘FontSize’, 18, ‘Color’, ‘k’);
% X軸ラベルにLaTeX数式を使用
xlabel(‘角度 $\theta$ (rad)’, ‘Interpreter’, ‘latex’, ‘FontSize’, 14);
ylabel(‘振幅 $A$’, ‘Interpreter’, ‘latex’, ‘FontSize’, 14); % Y軸ラベルにも数式
% 凡例にLaTeX数式を使用
legend(‘$\sin(\theta)$’, ‘$\cos(\theta)$’, ‘Interpreter’, ‘latex’, ‘Location’, ‘best’, ‘FontSize’, 12);
grid on;
% プロット結果の確認:
% タイトル、軸ラベル、凡例に表示される数式が、LaTeXによって非常に綺麗にレンダリングされます。
% 特に、ギリシャ文字、添字、上付き文字など、複雑な数式を正確に表現できます。
“`
解説:
* \sin(\theta)
, \cos(\theta)
, \theta
, A
などはLaTeXの数式コマンドです。
* これらのコマンドを$
で囲むことで、MATLABはこれらをLaTeXのインライン数式として解釈し、適切なフォントとレイアウトで表示します。この機能は、科学技術系のグラフ作成において非常に重要です。
2.4. 注釈とテキストの追加
グラフの特定の点や領域を強調したり、追加の情報を提供したりするために、テキストや矢印、図形などの注釈を追加することができます。これにより、グラフがより説得力を持ち、メッセージが明確になります。
2.4.1. テキストの追加:text
text(x, y, 'string')
関数は、指定したデータ座標(x, y)
にテキストを配置します。テキストの配置は、プロットされたデータ点に直接関連付けられるため、ズームやパンを行ってもテキストはデータ点に追従します。
例2-8: テキスト注釈の追加
“`matlab
% 例2-8: テキスト注釈の追加
x = linspace(0, 4*pi, 200);
y = sin(x);
plot(x, y);
title(‘サイン波とテキスト注釈’);
xlabel(‘X’);
ylabel(‘Y’);
grid on;
xlim([0 4*pi]); % X軸の範囲を明示的に設定
% 特定の点にテキストを追加
% ‘VerticalAlignment’と’HorizontalAlignment’でテキストと座標点の関係を調整
text(pi/2, 1, ‘最大値’, ‘VerticalAlignment’, ‘bottom’, ‘HorizontalAlignment’, ‘center’, ‘FontSize’, 10, ‘Color’, ‘red’, ‘FontWeight’, ‘bold’);
text(3pi/2, -1, ‘最小値’, ‘VerticalAlignment’, ‘top’, ‘HorizontalAlignment’, ‘center’, ‘FontSize’, 10, ‘Color’, ‘blue’, ‘FontWeight’, ‘bold’);
text(pi, 0, ‘ゼロクロス点’, ‘HorizontalAlignment’, ‘left’, ‘VerticalAlignment’, ‘top’, ‘FontSize’, 9, ‘Color’, ‘black’);
text(2.5pi, 0.7, ‘周期 $2\pi$’, ‘Interpreter’, ‘latex’, ‘FontSize’, 11, ‘Color’, ‘magenta’);
% プロット結果の確認:
% 指定したデータ座標にテキストが追加され、フォント、色、配置方法も指定通りになります。
% LaTeXインタプリタを使うことで、数式も美しく表示できます。
“`
解説:
* 'VerticalAlignment'
と'HorizontalAlignment'
は、指定した(x, y)
座標に対してテキストをどのように配置するかを制御します。
* 'VerticalAlignment'
: 'top'
, 'cap'
, 'middle'
, 'baseline'
, 'bottom'
* 'HorizontalAlignment'
: 'left'
, 'center'
, 'right'
これらのプロパティを適切に設定することで、テキストが指したいデータ点に正確に配置され、見やすくなります。
2.4.2. 矢印、ボックス、円などの図形:annotation
annotation
関数は、Figureウィンドウ全体に対して(つまり、データ座標ではなくFigureの相対座標で)テキストボックス、矢印、四角形、楕円、直線などの図形を追加します。これにより、グラフの特定の領域を強調したり、外部に情報を引き出したりすることができます。
annotation('arrow', [x_start y_start x_end y_end])
: 矢印を追加します。座標はFigureの相対座標(0から1の範囲)で、左下隅が(0,0)
、右上隅が(1,1)
です。annotation('textbox', [x_pos y_pos width height], 'String', '...')
: テキストボックスを追加します。位置とサイズもFigureの相対座標で指定します。annotation('rectangle', [x_pos y_pos width height])
: 四角形を追加します。
例2-9: 矢印とテキストボックスの追加
“`matlab
% 例2-9: 矢印とテキストボックスの追加
x = 0:0.1:10;
y = exp(-0.5x) . cos(2*x);
plot(x, y);
title(‘減衰振動と注釈’);
xlabel(‘時間’);
ylabel(‘振幅’);
grid on;
ylim([-1 1]);
% 特定のピークを指す矢印を追加
% 矢印はFigureの相対座標 [x_start y_start x_end y_end] で指定します。
% まずデータ座標からFigure相対座標への変換が必要になる場合がありますが、ここではおおよそで指定。
annotation(‘arrow’, [0.4 0.8], [0.6 0.75], ‘LineWidth’, 1.5, ‘Color’, [0.6 0.2 0.8], ‘HeadStyle’, ‘vback2’);
% 矢印の終点にテキストボックスを追加
annotation(‘textbox’, [0.3 0.75 0.15 0.05], ‘String’, ‘最初のピーク’, …
‘FitBoxToText’, ‘on’, ‘BackgroundColor’, [1 1 0.8], ‘EdgeColor’, [0.5 0.5 0.5], ‘LineWidth’, 0.5);
% 特定の範囲を強調する四角形を追加 (Figure相対座標)
annotation(‘rectangle’, [0.15 0.15 0.2 0.2], ‘FaceColor’, [0.9 0.9 1], ‘FaceAlpha’, 0.3, ‘EdgeColor’, ‘blue’, ‘LineWidth’, 1);
annotation(‘textbox’, [0.15 0.15 0.2 0.05], ‘String’, ‘重要な範囲’, ‘FitBoxToText’, ‘off’, ‘FontSize’, 9, ‘Color’, ‘blue’, ‘VerticalAlignment’, ‘top’);
% プロット結果の確認:
% グラフの指定したFigure相対座標に矢印、テキストボックス、四角形が追加されます。
% 四角形は半透明で、特定の領域を視覚的に強調するのに役立ちます。
“`
解説:
* annotation('arrow', [x_start y_start x_end y_end])
: 矢印の始点と終点をFigureの相対座標(左下 (0,0)
、右上 (1,1)
)で指定します。HeadStyle
などのプロパティで矢印の先端の形状も変更できます。
* annotation('textbox', [x_pos y_pos width height])
: テキストボックスの位置とサイズをFigureの相対座標で指定します。
* 'FitBoxToText', 'on'
: テキストのサイズに合わせてボックスのサイズを自動調整します。
* 'FaceAlpha', 0.3
: 図形の色を半透明にします(0が完全透明、1が完全不透明)。
annotation
は非常に強力ですが、相対座標の計算は少し手間がかかります。特定のデータ点を正確に指したい場合は、まずtext
関数でデータ座標にテキストを配置し、後からannotation
で矢印を追加したり、あるいはMATLABの対話的プロットツール(Figureウィンドウの「挿入」メニュー)で手動で配置・調整してから、その設定をコードとして生成する方が簡単な場合もあります。
第3章:さまざまなタイプのプロット
これまでは主に線グラフ(plot
)に焦点を当ててきましたが、MATLABは多種多様なグラフタイプをサポートしています。データの性質や伝えたいメッセージに応じて、最適なグラフを選択することが重要です。この章では、線グラフ以外の主要な2Dプロットと、基本的な3Dプロットについて学びます。
3.1. 複数データの重ね合わせとサブプロット
異なるデータセットを比較したり、複数の視点からデータを提示したりする場合に役立つテクニックです。
3.1.1. subplot
:複数グラフの配置
subplot(m, n, p)
関数を使うと、1つのFigureウィンドウ内に複数のグラフを格子状に配置できます。これは、関連する複数のグラフを一度に表示し、比較を容易にするために非常に有効です。
m
:グリッドの行数n
:グリッドの列数p
:現在のサブプロットのインデックス。左上から右へ、次に下の行へと順に数えます。
例3-1: サブプロットの利用
“`matlab
% 例3-1: サブプロットの利用
x = linspace(0, 2pi, 100);
y1 = sin(x);
y2 = cos(x);
y3 = sin(x) . cos(x); % 積の波形
y4 = x.^2; % 二乗の波形
figure; % 新しいFigureウィンドウを作成
% 2×2のグリッドの1番目 (左上)
subplot(2, 2, 1);
plot(x, y1, ‘b-‘);
title(‘sin(x)’);
grid on;
ylabel(‘振幅’);
% 2×2のグリッドの2番目 (右上)
subplot(2, 2, 2);
plot(x, y2, ‘r–‘);
title(‘cos(x)’);
grid on;
ylabel(‘振幅’);
% 2×2のグリッドの3番目 (左下)
subplot(2, 2, 3);
plot(x, y3, ‘g:’);
title(‘sin(x)cos(x)’);
grid on;
xlabel(‘X値’);
ylabel(‘振幅’);
% 2×2のグリッドの4番目 (右下)
subplot(2, 2, 4);
plot(x, y4, ‘m-.’);
title(‘x^2’);
grid on;
xlabel(‘X値’);
ylabel(‘Y値’);
% Figure全体のタイトル (MATLAB R2018a以降で推奨される関数)
% 以前のバージョンではsuptitle関数(非推奨またはアドオン)を利用するか、Figureに直接textで追加。
sgtitle(‘複数の波形の比較’, ‘FontSize’, 16, ‘FontWeight’, ‘bold’);
% プロット結果の確認:
% 1つのFigureウィンドウ内に、2行2列の配置で4つの独立したグラフが描画されます。
% 各グラフには独自のタイトル、軸、グリッドがあり、全体に共通のタイトルも追加されます。
“`
3.1.2. yyaxis
:左右独立したY軸
異なるスケールを持つ2つのデータセットを同じX軸に対してプロットしたい場合、yyaxis
関数を使うと、グラフの左右に独立したY軸を持つグラフを作成できます。これにより、異なる単位や振幅のデータを同じ時間軸やカテゴリ軸で比較することができます。
例3-2: yyaxis
を使った二重Y軸プロット
“`matlab
% 例3-2: yyaxisを使った二重Y軸プロット
t = 0:0.1:10; % 時間データ
temperature = 20 + 5sin(t/2); % 温度データ (単位: ℃)
pressure = 100 + 20exp(-t/5); % 圧力データ (単位: kPa)
figure;
yyaxis left; % 左Y軸をアクティブにする
plot(t, temperature, ‘b-‘, ‘LineWidth’, 1.5, ‘DisplayName’, ‘温度’);
ylabel(‘温度 (℃)’);
ylim([10 30]); % 左Y軸の範囲を設定。温度の適切な範囲に限定。
ax = gca; % 現在のAxesオブジェクトを取得
ax.YColor = ‘blue’; % 左Y軸の色を青に設定
yyaxis right; % 右Y軸をアクティブにする
plot(t, pressure, ‘r–‘, ‘LineWidth’, 1.5, ‘DisplayName’, ‘圧力’);
ylabel(‘圧力 (kPa)’);
ylim([90 120]); % 右Y軸の範囲を設定。圧力の適切な範囲に限定。
ax = gca; % 現在のAxesオブジェクトを再度取得(yyaxis rightによってアクティブな軸が変わる)
ax.YColor = ‘red’; % 右Y軸の色を赤に設定
xlabel(‘時間 (秒)’);
title(‘時間経過に伴う温度と圧力’);
grid on;
legend(‘Location’, ‘best’); % DisplayNameを使って凡例を自動生成
% プロット結果の確認:
% 同じX軸(時間)に対して、左に青色のY軸(温度)、右に赤色のY軸(圧力)が表示されます。
% それぞれのデータが異なるY軸スケールでプロットされ、関連性が見やすくなります。
“`
3.2. 特殊な2Dプロット
線グラフ以外にも、データの特徴をより効果的に伝えるための様々な2Dプロットがあります。データの種類(連続、離散、カテゴリカル)や、表現したい関係性に応じて最適なグラフを選びましょう。
3.2.1. 散布図 (scatter
)
2つの数値変数の関係性や、データ点の分布を示すのに最適です。各点が個別にプロットされ、点の色やサイズによって追加の情報を表現することもできます。
例3-3: 散布図の作成
“`matlab
% 例3-3: 散布図の作成
num_points = 100;
x = randn(1, num_points) * 3 + 10; % 平均10、標準偏差3の正規分布乱数
y = x * 0.8 + randn(1, num_points) * 2; % xに相関があり、ノイズを含むy
sizes = 10 + 50 * rand(1, num_points); % マーカーサイズを変えるためのデータ(例:第3の変数)
colors_val = rand(1, num_points) * 100; % マーカー色を変えるためのデータ(例:第4の変数)
figure;
% scatter(X, Y, S, C, ‘filled’)
% S: マーカーサイズ (ベクトル、各点に異なるサイズ)
% C: マーカー色 (ベクトル、各点に異なる色、カラーマップに従う) または RGB行列
scatter(x, y, sizes, colors_val, ‘filled’, ‘MarkerEdgeColor’, ‘k’, ‘LineWidth’, 0.5);
title(‘散布図の例:体重と身長’);
xlabel(‘身長 (cm)’);
ylabel(‘体重 (kg)’);
colorbar; % カラーバーを追加。colors_valが何を表すかを示す。
colormap(parula); % カラーマップをparulaに設定
grid on;
% プロット結果の確認:
% 各データ点が、XとYの値に基づいてプロットされ、そのサイズと色も可変です。
% カラーバーは、点の色のグラデーションが対応するcolors_valの値をどのように表しているかを示します。
“`
解説:
* scatter(x, y, S, C, 'filled')
:
* S
: マーカーサイズを指定するベクトル。各点のサイズを個別に指定できます(例: データの頻度や重要度)。
* C
: マーカーの色を指定するベクトル。この場合、MATLABは指定されたカラーマップ(colormap
)に基づいて色を割り当てます。あるいは、RGB値の3列行列を渡して、各点のRGB色を直接指定することもできます。
* 'filled'
: マーカー内部を塗りつぶします。
3.2.2. 棒グラフ (bar
)
カテゴリカルデータや、離散的な値の比較に適しています。各カテゴリの値を棒の高さで視覚的に表現します。
例3-4: 棒グラフの作成
“`matlab
% 例3-4: 棒グラフの作成
categories = {‘製品A’, ‘製品B’, ‘製品C’, ‘製品D’, ‘製品E’};
values = [25 32 18 45 30]; % 各製品の売上
figure;
bar(categories, values, ‘FaceColor’, [0.3 0.7 0.9], ‘EdgeColor’, ‘k’, ‘LineWidth’, 0.8); % カテゴリ名と値を指定
title(‘各製品の月間売上’);
xlabel(‘製品カテゴリ’);
ylabel(‘売上 (単位: 万円)’);
grid on;
ylim([0 50]); % Y軸の範囲を固定することで比較しやすくする
% プロット結果の確認:
% 各カテゴリに対応する高さの棒グラフが表示されます。棒の色や縁もカスタマイズされています。
“`
3.2.3. ヒストグラム (histogram
)
数値データの分布を可視化します。データをいくつかの「ビン」(区間)に分割し、各ビンに含まれるデータ点の頻度(度数)を棒の高さで表します。
例3-5: ヒストグラムの作成
“`matlab
% 例3-5: ヒストグラムの作成
data = randn(1, 1000) * 2 + 5; % 平均5、標準偏差2の正規分布に従う1000個のデータ
data_skewed = exprnd(3, 1, 1000); % 平均3の指数分布に従う1000個のデータ (非対称な分布)
figure;
subplot(1, 2, 1);
h1 = histogram(data, 20); % データを20個の等幅なビンに分割してヒストグラムを作成
title(‘正規分布データのヒストグラム’);
xlabel(‘値’);
ylabel(‘頻度’);
h1.FaceColor = [0.8 0.5 0.2]; % 棒の色
h1.EdgeColor = ‘k’; % 棒の縁の色
grid on;
subplot(1, 2, 2);
h2 = histogram(data_skewed, ‘BinWidth’, 1); % ビンの幅を1に指定してヒストグラムを作成
title(‘指数分布データのヒストグラム’);
xlabel(‘値’);
ylabel(‘頻度’);
h2.FaceColor = [0.2 0.5 0.8]; % 棒の色
h2.EdgeColor = ‘k’;
grid on;
% プロット結果の確認:
% 左のグラフは正規分布データのベル型、右のグラフは指数分布データの右に偏った分布を示します。
% histogram
関数は、戻り値としてヒストグラムオブジェクトを返すため、それを使ってさらにカスタマイズできます。
“`
3.2.4. 円グラフ (pie
)
全体に対する各カテゴリの割合を示すのに適しています。データ全体の構成比を視覚的に理解しやすいです。
例3-6: 円グラフの作成
“`matlab
% 例3-6: 円グラフの作成
sales = [30 25 15 10 20]; % 各製品の売上割合(合計100になる必要はない、MATLABが自動で正規化)
labels = {‘製品A (30%)’, ‘製品B (25%)’, ‘製品C (15%)’, ‘製品D (10%)’, ‘製品E (20%)’};
explode = [0 0 1 0 0]; % 3番目のスライス(製品C)を円の中心から少し切り離して強調
figure;
p = pie(sales, explode, labels); % pie関数はグラフオブジェクトのハンドルを返す
title(‘製品別売上割合’);
colormap(parula); % カラーマップの変更 (デフォルトはplotのサイクルカラー)
% 円グラフのテキストラベルのフォントサイズ調整 (オプション)
% pie関数が返すオブジェクト配列pからTextオブジェクトを特定し調整
for k = 2:2:length(p) % テキストオブジェクトは偶数インデックスにある
p(k).FontSize = 10;
end
% プロット結果の確認:
% 各割合に応じた扇形が描かれ、ラベルと割合が表示されます。
% 製品Cのスライスが強調されて切り離され、視覚的な注目を集めます。
“`
3.2.5. エラーバー (errorbar
)
実験データなどで、測定値とその誤差範囲(不確かさ)を同時に表示したい場合に便利です。データの信頼性を視覚的に伝えることができます。
例3-7: エラーバーの作成
“`matlab
% 例3-7: エラーバーの作成
x_data = 1:5; % 測定点
y_data = [10 12 9 15 11]; % 測定値
error_y = [1.5 2 1 2.5 1.8]; % 各点でのY方向の誤差(標準偏差など)
figure;
errorbar(x_data, y_data, error_y, ‘o-‘, ‘LineWidth’, 1.5, ‘MarkerSize’, 8, ‘MarkerFaceColor’, ‘b’, ‘Color’, ‘r’);
title(‘データとエラーバー’);
xlabel(‘測定点’);
ylabel(‘測定値’);
grid on;
xlim([0.5 5.5]); % X軸の範囲を調整
ylim([5 20]); % Y軸の範囲を調整
% プロット結果の確認:
% 各データ点に対して、上下に誤差範囲を示すエラーバーが表示されます。
% 点と線のスタイル、色もカスタマイズされています。
“`
3.3. 3Dプロットの基本
MATLABは3次元データの可視化も非常に強力です。地形データ、関数曲面、点群データなどを3次元空間に描画することで、複雑なデータの構造を直感的に理解することができます。3Dプロットでは、視点の調整(回転や傾き)が重要になります。
3.3.1. 3D線プロット (plot3
)
X, Y, Zの3次元座標を持つ点の系列を線で結びます。3次元空間における軌跡や曲線を示すのに使われます。
例3-8: 3D線プロットの作成
“`matlab
% 例3-8: 3D線プロットの作成
t = 0:pi/50:10*pi; % パラメータtの範囲
x = sin(t); % X座標
y = cos(t); % Y座標
z = t; % Z座標
figure;
plot3(x, y, z, ‘b-‘, ‘LineWidth’, 2); % 青い実線で太さ2の線
title(‘3次元らせん’);
xlabel(‘X軸’);
ylabel(‘Y軸’);
zlabel(‘Z軸’);
grid on;
axis equal; % 各軸のスケールを同じにする。これにより、らせんが歪まずに表示されます。
view(3); % 3Dビューを設定(デフォルトは azimuth=-37.5, elevation=30)。
% プロット結果の確認:
% 3D空間に青いらせんが描画されます。Figureウィンドウをマウスでドラッグすることで、自由に視点を回転させることができます。
% これは3Dプロットを理解する上で非常に重要です。
“`
3.3.2. メッシュプロット (mesh
) とサーフェスプロット (surf
)
2変数関数 $z = f(x, y)$ のような曲面をプロットする際に使われます。これらの関数を使うには、まずX-Y平面上のグリッド点を生成する必要があります。これにはmeshgrid
関数が便利です。
mesh(X, Y, Z)
: ワイヤーフレーム(網目状の線)で曲面を描画します。点の接続関係が明確になります。surf(X, Y, Z)
: 塗りつぶされた面で曲面を描画します。表面の形状や色が視覚的に強調されます。
meshgrid
関数の利用:
[X, Y] = meshgrid(x_vector, y_vector)
は、1次元のx_vector
とy_vector
から、2次元のグリッド点を表す2つの行列X
とY
を生成します。X
はx_vector
の値が列方向に繰り返された行列、Y
はy_vector
の値が行方向に繰り返された行列になります。これにより、X-Y平面上の全ての交点(グリッド点)に対応するZ値を計算できるようになります。
例3-9: メッシュプロットとサーフェスプロットの作成
“`matlab
% 例3-9: メッシュプロットとサーフェスプロットの作成
[X, Y] = meshgrid(-2:0.1:2); % X-Y平面のグリッド点を生成
Z = X .* exp(-X.^2 – Y.^2); % Z値を計算 (例: ガウス曲面に似た形状)
figure;
subplot(1, 2, 1); % 1行2列の1番目のサブプロット
mesh(X, Y, Z); % メッシュプロット
title(‘メッシュプロット ($z = xe^{-x^2-y^2}$)’, ‘Interpreter’, ‘latex’);
xlabel(‘X’);
ylabel(‘Y’);
zlabel(‘Z’);
colormap(jet); % カラーマップをjetに設定 (グラデーションが強調される)
colorbar; % カラーバーを追加(Z値と色の対応を示す)
view(3); % 3Dビューを設定
grid on;
subplot(1, 2, 2); % 1行2列の2番目のサブプロット
surf(X, Y, Z); % サーフェスプロット
title(‘サーフェスプロット ($z = xe^{-x^2-y^2}$)’, ‘Interpreter’, ‘latex’);
xlabel(‘X’);
ylabel(‘Y’);
zlabel(‘Z’);
colormap(parula); % カラーマップをparulaに設定 (MATLAB R2014b以降のデフォルト)
colorbar;
view(3); % 3Dビューを設定
shading interp; % 面の陰影を滑らかにする (ピクセル間の色を補間)
lighting phong; % ライティング効果を追加し、よりリアルな陰影を表現
grid on;
% プロット結果の確認:
% 左のグラフはワイヤーフレーム(網目状)で曲面が描かれ、右のグラフは塗りつぶされた3D曲面が表示されます。
% サーフェスプロットでは、shadingとlightingを組み合わせることで、より立体感のある表現が可能です。
% 両方のグラフで、マウスでドラッグすることで視点を自由に回転させることができます。
“`
解説:
* meshgrid(x_vec, y_vec)
: 2つのベクトルx_vec
とy_vec
から、X-Y平面のグリッド点を表す2つの行列X
とY
を生成します。これにより、$Z = f(X, Y)$ のように行列演算でZ値を一括計算できます。
* colormap(map_name)
: グラフの色付けに使われるカラーマップを変更します。jet
, parula
, hsv
, hot
, cool
など様々な組み込みカラーマップがあります。データの種類(連続、離散)や、伝えたい情報の性質によって適切なカラーマップを選択することが重要です。
* colorbar
: プロットで使われている色の値スケールを示すカラーバーを追加します。これにより、グラフ上の特定の色がどのZ値に対応するのかを読み解くことができます。
* view(azimuth, elevation)
: 3Dプロットの視点を設定します。azimuth
はZ軸周りの水平角度(XY平面上での回転)、elevation
はXY平面からの垂直角度(Z軸からの仰角)です。
* shading interp
: サーフェスプロットの面間の色を補間し、ピクセル化された見た目ではなく、滑らかで連続的な色変化を実現します。
* lighting phong
: フォンシェーディングと呼ばれるライティング効果を追加し、光の反射モデルを適用することで、よりリアルな陰影を表現します。光源の設定(light
関数)と組み合わせるとさらに高度な効果が得られます。
3.3.3. 等高線プロット (contour
, contourf
)
3Dデータを2D平面上の等高線として表現します。地形図や温度分布図などでよく使われ、Z値が同じ点を結んだ線(等高線)を描くことで、曲面の高さ情報を2Dで視覚化します。
contour(X, Y, Z, levels)
: 指定したレベル数またはレベル値で線による等高線を描画します。contourf(X, Y, Z, levels)
: 等高線間の領域を色で塗りつぶします。Z値の範囲が色で表現されるため、視覚的に分かりやすいです。
例3-10: 等高線プロットの作成
“`matlab
% 例3-10: 等高線プロットの作成
[X, Y] = meshgrid(-2:0.05:2);
Z = X.^2 + Y.^2; % 例: パラボロイド曲面 (Z = x^2 + y^2)
figure;
subplot(1, 2, 1); % 1行2列の1番目のサブプロット
contour(X, Y, Z, 10); % 10本の等高線を描画
title(‘等高線プロット (線)’);
xlabel(‘X’);
ylabel(‘Y’);
colorbar; % カラーバーを追加
grid on;
axis equal; % X,Y軸のスケールを等しくし、円が円に見えるようにする
subplot(1, 2, 2); % 1行2列の2番目のサブプロット
contourf(X, Y, Z, 15); % 15段階で塗りつぶし等高線を描画
title(‘等高線プロット (塗りつぶし)’);
xlabel(‘X’);
ylabel(‘Y’);
colorbar; % カラーバーを追加
grid on;
axis equal;
% プロット結果の確認:
% 左のグラフは、Z値が同じ点を結んだ線(同心円)で等高線が描かれます。
% 右のグラフは、Z値の範囲が色で塗り分けられた等高線図が表示されます。
% 塗りつぶし等高線は、Z値の変化の勾配をより直感的に理解するのに役立ちます。
“`
第4章:プロットの高度な操作とプログラム化
MATLABのプロットは、ただ関数を呼び出すだけでなく、グラフの各要素を「オブジェクト」として捉えることで、より高度な制御とプログラムによる自動化が可能です。このオブジェクト指向のアプローチは、複雑なグラフのカスタマイズや、大量のグラフを効率的に生成する際に非常に強力なツールとなります。また、作成したグラフを論文投稿やプレゼンテーションのために、様々な高品質な形式でエクスポートする方法も学びます。
4.1. figure
とaxes
オブジェクトの理解
MATLABのグラフィックスシステムは、「ハンドルグラフィックス」と呼ばれるオブジェクト指向の考え方に基づいています。プロットされる各要素(Figureウィンドウ、軸、線、テキストなど)はそれぞれ独立したオブジェクトであり、それらの「プロパティ」を変更することで、グラフの見た目を詳細にカスタマイズできます。
- Figureオブジェクト: グラフが表示されるウィンドウ全体を表します。このオブジェクトのプロパティには、ウィンドウのサイズ、背景色、タイトルバーのテキストなどが含まれます。
- Axesオブジェクト: グラフが描画される実際のプロット領域を表します。X軸、Y軸、Z軸、タイトル、軸ラベル、目盛り、グリッド線などがこのAxesオブジェクトに含まれます。1つのFigure内に複数のAxesを持つことができます(
subplot
の場合など)。 - Lineオブジェクト:
plot
関数によって描画される線を表します。線の色、太さ、線種、マーカーの種類、サイズなどがLineオブジェクトのプロパティです。 - Textオブジェクト:
text
,xlabel
,ylabel
,title
,legend
によって作成される全てのテキスト要素を表します。フォントの種類、サイズ、太さ、色、配置などがTextオブジェクトのプロパティです。
これらのオブジェクトへの「ハンドル」(参照)を取得することで、そのオブジェクトのプロパティをプログラム的に変更できます。
fig_handle = figure;
: 新しいFigureを作成し、そのFigureオブジェクトのハンドルを取得します。ax_handle = gca;
: 現在アクティブなAxesオブジェクトのハンドルを取得します(g
は”get”、ca
は”current axes”の略)。line_handle = plot(...);
:plot
関数は、描画されたLineオブジェクトのハンドルを返します。複数の線をプロットした場合は、それぞれのLineオブジェクトのハンドルがベクトルとして返されます。text_handle = title(...);
:title
関数は、作成されたTextオブジェクトのハンドルを返します。xlabel
,ylabel
,legend
なども同様です。
これらのハンドルを使って、ドット表記(.
)でプロパティにアクセスし、値を設定します。
例4-1: オブジェクトハンドルを使ったプロパティ設定
“`matlab
% 例4-1: オブジェクトハンドルを使ったプロパティ設定
x = linspace(0, 2*pi, 100);
y1 = sin(x);
y2 = cos(x);
% Figureの作成とハンドル取得
fig = figure(‘Name’, ‘カスタムグラフ’, ‘Color’, [0.95 0.95 0.95]); % Figureの背景色を設定
% プロットの実行とLineオブジェクトのハンドル取得
% plot関数は、描画された各ラインのハンドルをベクトルとして返します。
h = plot(x, y1, ‘DisplayName’, ‘サイン波’, … % DisplayNameは凡例で自動的に使われる
x, y2, ‘DisplayName’, ‘コサイン波’);
% h(1)はy1の線、h(2)はy2の線に対応
% Axesオブジェクトのハンドル取得
ax = gca;
% Axesのプロパティ設定
ax.Title.String = ‘オブジェクト指向グラフカスタマイズ’; % タイトル文字列
ax.Title.FontSize = 16;
ax.XLabel.String = ‘角度 (rad)’; % X軸ラベル文字列
ax.XLabel.FontSize = 12;
ax.YLabel.String = ‘値’; % Y軸ラベル文字列
ax.YLabel.FontSize = 12;
ax.FontSize = 10; % 目盛りラベルのフォントサイズ
ax.FontWeight = ‘bold’; % 軸ラベル、目盛りラベルを太字に
ax.XColor = [0 0.5 0]; % X軸の色を緑に
ax.YColor = [0.7 0 0]; % Y軸の色を赤に
ax.Box = ‘on’; % グラフの周囲にボックスを表示
ax.GridLineStyle = ‘:’; % グリッド線種を点線に
ax.GridColor = [0.5 0.5 0.5]; % グリッド線の色をグレーに
ax.GridAlpha = 0.5; % グリッド線の透明度 (0:完全透明, 1:完全不透明)
% Lineオブジェクトのプロパティ設定 (hはLineオブジェクトのベクトル)
h(1).Color = [0 0.447 0.741]; % MATLAB標準の青色をh(1)に
h(1).LineWidth = 1.5;
h(2).Color = [0.850 0.325 0.098]; % MATLAB標準のオレンジ色をh(2)に
h(2).LineStyle = ‘–‘; % h(2)を破線に
h(2).LineWidth = 1.5;
% 凡例の追加 (plotでDisplayNameを設定した場合、引数なしで呼ぶと自動で凡例が生成される)
leg = legend(‘Location’, ‘northwest’); % 凡例のハンドルも取得
leg.FontSize = 10;
leg.Box = ‘off’; % 凡例ボックスの枠を非表示に
% プロット結果の確認:
% 各プロパティが個別に、かつ詳細に設定されたグラフが表示されます。
% このようにハンドルを通じてプロパティを設定することで、非常に細かな調整が可能になり、
% またコードの可読性と再利用性が向上します。
“`
プロパティインスペクタ:
Figureウィンドウのツールバーにある「プロットツール」ボタン(通常は歯車アイコン)をクリックすると、プロパティインスペクタというGUIツールが開きます。これは、MATLABのグラフィックスオブジェクトのプロパティをGUIで視覚的に確認・変更できるツールです。グラフ上の任意の要素(線、軸、タイトルなど)を選択すると、そのプロパティとその現在の値が一覧表示され、GUIで直接変更できます。このツールで変更した内容を、コマンドウィンドウに表示されるコードとしてコピーすることもできるため、目的のプロパティ名と値を調べる際に非常に役立ちます。
4.2. プログラムによるプロットの自動化
ハンドルグラフィックスを理解することで、データ処理とグラフ作成を一体化したMATLABスクリプトや関数を作成し、プロット作業を自動化できます。これは、多数のデータをプロットする場合や、定期的に同じ形式のレポートを生成する場合に特に有効です。
例4-2: ループ処理での複数プロットと自動保存
この例では、複数の波形グラフを生成し、それぞれを個別のPNGファイルとして自動的に保存するMATLAB関数を作成します。
“`matlab
% 例4-2: ループ処理での複数プロットと自動保存
function generate_wave_plots(num_waves)
% 指定された数の波形プロットを生成し、PNGファイルとして保存する関数
%
% 使用例:
% generate_wave_plots(5); % 5つの異なる波形グラフを生成し保存
if nargin < 1
num_waves = 3; % 引数が指定されなければ、デフォルトで3つの波形を生成
end
% 出力フォルダのパスを定義し、存在しなければ作成
output_folder = ‘generated_wave_plots’;
if ~exist(output_folder, ‘dir’) % output_folderが存在しない場合
mkdir(output_folder); % フォルダを作成
fprintf(‘出力フォルダ “%s” を作成しました。\n’, output_folder);
end
fprintf(‘%d個の波形プロットを生成しています…\n’, num_waves);
for i = 1:num_waves
% — 1. データの生成 —
x = linspace(0, 2*pi, 100);
frequency = i * 0.5; % 波形ごとに周波数を変更
amplitude = 1 + rand() * 0.5; % 波形ごとに振幅をランダムに変更
y = amplitude * sin(frequency * x + rand() * pi); % 位相もランダムに変更
% --- 2. FigureとAxesの作成 ---
% 'Visible', 'off' でグラフを画面に表示せずバックグラウンドで作成
% 大量のグラフを生成する際に画面がちらつくのを防ぎ、処理を高速化
fig = figure('Visible', 'off');
% Axesオブジェクトを特定のFigureに追加
ax = axes(fig);
% --- 3. プロットの実行とカスタマイズ ---
% Axesオブジェクト(ax)をplot関数の最初の引数として渡すことで、
% このAxes内にプロットすることを明示します。
plot(ax, x, y, 'LineWidth', 1.5, 'Color', rand(1,3)); % ランダムな色でプロット
% タイトル、ラベル、グリッド設定もAxesオブジェクトに対して適用
title(ax, sprintf('波形 %d (周波数: %.1f Hz, 振幅: %.2f)', i, frequency, amplitude), 'FontSize', 12);
xlabel(ax, '時間 [秒]', 'FontSize', 10);
ylabel(ax, '振幅 [単位なし]', 'FontSize', 10);
grid(ax, 'on'); % Axesオブジェクトに対してグリッドを適用
% --- 4. ファイル名の生成と保存 ---
% 保存するファイルのパスと名前を生成
filename = fullfile(output_folder, sprintf('wave_plot_%02d.png', i));
% プロットをPNGファイルとして保存 (高解像度)
% print関数はより詳細な制御が可能で、高品質な出力が求められる場合に推奨されます。
% -dpng: PNG形式で出力
% -r300: 解像度を300dpiに設定
print(fig, filename, '-dpng', '-r300');
close(fig); % Figureを閉じることで、メモリを解放します。
fprintf(' 保存しました: %s\n', filename);
end
fprintf(‘全てのプロットが生成され、”%s” フォルダに保存されました。\n’, output_folder);
end
% — コマンドウィンドウでこの関数を実行するには、以下のように入力します —
% generate_wave_plots(5); % 5つの異なる波形グラフを生成して保存
“`
解説:
* function generate_wave_plots(num_waves)
: このコードはMATLAB関数として定義されています。関数として定義することで、引数(num_waves
)を使って柔軟に動作を制御でき、再利用性が高まります。
* figure('Visible', 'off')
: このオプションを使用すると、Figureウィンドウを画面に表示せずに、バックグラウンドでグラフを作成できます。これにより、大量のグラフを自動生成する際に画面がちらつくのを防ぎ、処理を高速化できます。
* ax = axes(fig)
: axes
関数にFigureオブジェクトのハンドルfig
を渡すことで、特定のFigure内にAxesオブジェクトを明示的に作成します。これは、subplot
を使う場合や、プロットするAxesを厳密に制御したい場合に特に便利です。
* plot(ax, x, y, ...)
: plot
関数の最初の引数としてAxesオブジェクトのハンドルax
を渡すことで、そのAxes内にプロットすることをMATLABに指示します。title
, xlabel
, ylabel
, grid
なども同様に、最初の引数にax
を渡すことで、特定のAxesに適用されます。
* print(fig, filename, '-dpng', '-r300')
: print
関数は、指定したFigure(fig
)を、指定したファイル名(filename
)で、指定した形式(-dpng
はPNG形式)、指定した解像度(-r300
は300dpi)で保存します。この関数は、saveas
よりも多くのオプションを提供し、高解像度や特定の色空間での出力など、より細かい制御が可能です。
* close(fig)
: 各ループの最後にFigureを閉じることで、不要になったFigureオブジェクトがメモリ上に残り続けるのを防ぎ、MATLABのメモリ使用量を最適化します。
4.3. プロットの対話的編集とエクスポート
MATLABで作成したグラフは、Figureウィンドウのメニューやツールバーを使って対話的に編集したり、様々な画像形式で保存したりすることができます。これにより、最終的な微調整を行ったり、他のソフトウェアで使用できる形式で出力したりすることが可能になります。
4.3.1. Figureウィンドウのツールバーとメニュー
Figureウィンドウには、ファイルの保存、コピー、印刷、ズーム、パン、データチップ、プロパティエディタなどの標準的な機能を提供するツールバーとメニューが用意されています。
- 「ファイル」メニュー
- 「保存」/「名前を付けて保存」:
.fig
形式でFigureを保存します。この形式は、MATLAB独自のファイル形式で、後でMATLABで開くと、プロットのデータや全てのプロパティ設定が完全に復元されます。これにより、作業を中断して後で再開したり、他のMATLABユーザーとグラフの状態を完全に共有したりすることが可能です。 - 「コピーオプション」: Figureをクリップボードにコピーします。例えば、WordやPowerPointに直接貼り付けることができます。MATLABはデフォルトでベクタ形式(EMF形式など)でコピーしようとするため、拡大しても画質が劣化しにくいという利点があります。
- 「印刷」: プリンタに直接出力します。
- 「エクスポート設定」: エクスポート時の詳細な設定を行うダイアログを開きます。解像度、背景色、フォント設定など、多くのオプションをGUIで調整できます。
- 「エクスポート」: 様々な画像形式(PNG, JPG, TIFF, EPS, PDFなど)で保存します。
- 「保存」/「名前を付けて保存」:
4.3.2. 「プロットツール」と「プロパティインスペクタ」
第2章でも触れましたが、Figureウィンドウのツールバーにある「プロットツール」アイコン(通常は歯車アイコン)をクリックすると、プロパティインスペクタが開きます。このGUIツールは、MATLABのグラフィックスオブジェクトのプロパティをGUIで視覚的に確認・変更できるツールです。グラフ上の任意の要素(線、マーカー、軸、タイトル、凡例など)をクリックして選択すると、右側のペインにその要素の全てのプロパティとその現在の値が一覧表示されます。ここで値を直接変更すると、グラフにリアルタイムで反映されます。
プロパティインスペクタは、コードを書かずにグラフのほぼ全ての要素をデザインできるため、デザインの微調整や試行錯誤に非常に便利です。また、ここで設定した内容をコードとして生成することも可能です(「ファイル」メニュー -> 「コードを生成」)。
4.3.3. 画像ファイルへのエクスポート (print
, saveas
)
コードを使ってグラフをエクスポートすることは、自動化されたレポート生成、大量のグラフのバッチ処理、あるいは特定の品質要件を満たすファイル出力に不可欠です。
saveas(figure_handle, filename, format)
: 指定したFigureを様々な画像形式で保存するシンプルな関数です。基本的な用途には十分です。figure_handle
: 保存したいFigureのハンドル(例:fig
)。現在のFigureを保存する場合はgcf
(get current figure) を使用。filename
: 保存するファイル名(例:'my_plot.png'
)。format
: 保存形式を指定する文字列(例:'png'
,'jpeg'
,'tiff'
,'eps'
,'pdf'
)。
print(figure_handle, filename, options)
:saveas
よりも多くのオプションを提供し、高解像度や特定の色空間での出力など、より細かい制御が可能です。論文投稿や商業印刷など、高品質な出力が求められる場合に推奨されます。options
の例:-dpng
,-djpeg
,-dtiff
: 各種ラスター画像形式(PNG, JPEG, TIFF)-depsc
,-depsc2
: EPS形式(PostScriptカラー/レベル2) – ベクタ画像-dpdf
: PDF形式 – ベクタ画像-rDPI
: 解像度を指定(例:-r300
で300dpi)。ラスター画像形式にのみ適用。dpi (dots per inch) は、画像の精細さを表す単位です。-opengl
,-painters
: レンダリング方法の指定。-opengl
は高速ですが、一部のベクタ形式で問題が生じる可能性があります。-painters
はベクタ出力に強く、より正確な描画を行いますが、複雑なグラフでは処理が遅くなることがあります。
例4-3: グラフのエクスポート
“`matlab
% 例4-3: グラフのエクスポート
x = linspace(0, 2*pi, 200);
y1 = sin(x);
y2 = cos(x);
fig = figure(‘Position’, [100 100 800 600]); % Figureを作成し、サイズを指定
plot(x, y1, ‘b-‘, x, y2, ‘r–‘);
title(‘エクスポート例’, ‘FontSize’, 14);
xlabel(‘X軸’, ‘FontSize’, 12);
ylabel(‘Y軸’, ‘FontSize’, 12);
legend(‘Sin’, ‘Cos’, ‘Location’, ‘best’);
grid on;
% — saveas 関数を使った保存例 —
% PNG形式で保存 (デフォルト解像度)
saveas(fig, ‘my_plot_default.png’);
fprintf(‘my_plot_default.png を保存しました。\n’);
% JPG形式で保存
saveas(fig, ‘my_plot.jpg’);
fprintf(‘my_plot.jpg を保存しました。\n’);
% — print 関数を使った保存例 —
% 高解像度PNGで保存 (300dpi)
print(fig, ‘my_plot_300dpi.png’, ‘-dpng’, ‘-r300’);
fprintf(‘my_plot_300dpi.png (300dpi) を保存しました。\n’);
% PDF形式で保存 (ベクタ形式なので高画質、出版物向けに推奨)
% -bestfit オプションは、プロットがPDFページのサイズにフィットするように調整します。
print(fig, ‘my_plot.pdf’, ‘-dpdf’, ‘-bestfit’);
fprintf(‘my_plot.pdf を保存しました。\n’);
% EPS形式で保存 (論文向けの高画質ベクタ形式、透明度や一部の複雑な描画に注意)
% -depsc はカラーEPS、-depsc2 はより新しいレベル2のPostScript
print(fig, ‘my_plot.eps’, ‘-depsc’);
fprintf(‘my_plot.eps を保存しました。\n’);
close(fig); % Figureを閉じる(不要なウィンドウを閉じてメモリを解放)
% プロット結果の確認:
% 現在のMATLABのワーキングディレクトリに、指定された形式と解像度の画像ファイルが複数生成されます。
% 各ファイルを画像ビューアで開いて、画質の違いを確認してみてください。
“`
エクスポート形式の選択のヒント:
* PNG/JPG/TIFF (ラスター画像): ピクセル(点)の集まりで画像を表現します。Webページ、プレゼンテーション、デジタル文書など、一般的な用途に適しています。
* JPG: 写真のように色のグラデーションが多い画像に適しており、ファイルサイズが小さいです。非可逆圧縮のため、保存と読み込みを繰り返すと画質が劣化する可能性があります。
* PNG: 線画、テキスト、アイコンなど、色の境界がはっきりしている画像や透明度が必要な場合に適しています。可逆圧縮で画質の劣化がなく、背景の透過も可能です。
* TIFF: 高品質な印刷物や学術用途でよく使われます。様々な圧縮オプションを持ち、非圧縮で保存することも可能です。
これらのラスター画像は、拡大すると画質が劣化し(ピクセルが粗くなる)、「ジャギー」(ギザギザ)が見えることがあります。そのため、高解像度(例えば300dpiや600dpi)で出力することが推奨されます。
* EPS/PDF (ベクター画像): 図形を数式や幾何学的情報として表現します。論文、書籍、プロフェッショナルな印刷物など、最高の品質が求められる場合に最適です。
* EPS (Encapsulated PostScript): 科学技術論文や学術雑誌で標準的に使われる形式です。拡大しても画質が劣化しないため、非常にシャープな線やテキストが維持されます。ただし、透明度のあるオブジェクトや複雑な3Dプロットでは、レンダリングに時間がかかったり、一部の要素が正しくエクスポートされない場合もあります。
* PDF (Portable Document Format): EPSと同様にベクター形式をサポートし、印刷だけでなくデジタルドキュメントの共有にも広く使われます。透明度や複雑なグラフィックスのサポートがEPSよりも優れており、最近では論文投稿にもPDFが推奨されるケースが増えています。
どちらのベクター形式も、ファイルサイズはラスター画像よりも大きくなる傾向がありますが、画質に関しては圧倒的な優位性があります。
4.3.4. MATLAB Figureファイル (.fig) の保存と再読み込み
MATLAB Figureファイル(.fig
)は、グラフのデータと全てのプロパティ設定(色、フォント、軸の範囲など)をMATLAB固有のバイナリ形式で保存する特別なファイルです。このファイルを保存しておけば、後でMATLABで開いた際に、プロットの状態を完全に復元し、対話的に編集を続けることができます。
savefig(fig, 'my_figure.fig');
openfig('my_figure.fig');
これは、作成途中のグラフを保存したり、MATLABを起動していない他のMATLABユーザーとグラフの「編集可能な状態」を共有したりするのに非常に便利です。
第5章:よくある問題とトラブルシューティング
MATLABプロットは強力ですが、初めて使う方にとっては予期せぬ挙動やエラーに遭遇することもあります。ここでは、初心者がつまずきやすいポイントや、一般的なトラブルシューティングについて解説します。これらの知識を持つことで、問題解決の時間を短縮し、よりスムーズにグラフ作成を進めることができます。
5.1. グラフが表示されない/空白になる
figure
コマンドを忘れていないか?: 新しいプロットを作成する前にfigure
コマンドを打たないと、MATLABは既存のFigureウィンドウ(もしあれば)を上書きしてしまうか、あるいは何も表示されないことがあります。特に、スクリプトを複数回実行する際に、前のFigureが閉じていないと問題になることがあります。明確な制御のために、常にfigure;
から始めるか、figure(1);
のように特定のFigure番号を指定する習慣をつけると良いでしょう。hold on
とhold off
のバランス:hold on
コマンドを使うと、その後のplot
コマンドが既存のグラフに重ねて追加されます。しかし、hold off
を忘れると、意図しないプロットが追加され続け、最終的に見づらくなったり、意図しない場所に線が描かれたりすることがあります。また、hold off
した後でplot
を呼び出すと、新しいFigureが自動的に作成されることも覚えておきましょう。- データ範囲の問題: X軸やY軸のデータが極端に狭い範囲に集中している、あるいは広すぎるために、データが見えないことがあります。例えば、データが全てX=100付近に集中しているのに、X軸の範囲が0から1000まで設定されていると、線が点のようにしか見えないことがあります。
- 解決策:
axis auto
コマンドを使うと、データに最適な軸範囲に自動調整されます。あるいは、xlim([xmin xmax])
やylim([ymin ymax])
で表示したい範囲を明示的に指定してください。
- 解決策:
- データが数値ではない:
plot
関数は数値データしか受け付けません。文字(文字列セル配列など)や、空の配列をplot
関数に渡していないか確認してください。エラーメッセージを注意深く読み、型が一致しない場合はstr2double
などで数値に変換する必要があります。
5.2. 軸の範囲がおかしい
- 自動調整に任せすぎている: MATLABはデフォルトで「最適な」軸範囲を選びますが、常にあなたの意図した通りになるとは限りません。例えば、データに一つだけ極端な外れ値があると、その値を含むように軸範囲が広がり、他の大部分のデータが小さく潰れてしまうことがあります。
- 解決策: 関心のあるデータ範囲を
xlim
やylim
で明示的に指定してください。
- 解決策: 関心のあるデータ範囲を
- データの型が適切でない: 日付や時刻のデータをプロットする場合、MATLABは通常、それらを日付軸として扱います。しかし、日付データと通常の数値データが混在したり、データの変換が不適切な場合、表示がおかしくなることがあります。
- 解決策: 日付データは
datetime
型として扱うか、datenum
関数を使って数値に変換し、軸のラベルはdatetick
関数などを使って日付形式で表示するように設定します。
- 解決策: 日付データは
- 対数軸とゼロ/負の値: 対数軸(
semilogx
,semilogy
,loglog
)は、数学的に0や負の値をプロットできません(対数関数が定義されないため)。- 解決策: プロットしようとしているデータに0や負の値が含まれていないか確認してください。もし含まれている場合は、その値をデータセットから除外するか、非常に小さな正の値に置き換える(ただし、データの意味が変わらないか注意)などの前処理が必要です。
5.3. 凡例が表示されない/重なる
- 凡例の文字列が不足している:
legend
関数に渡す文字列の数が、プロットされた線の数と一致していない場合、凡例が正しく表示されないか、エラーになることがあります。 DisplayName
プロパティの使用: MATLAB R2014b以降では、plot
関数を呼び出す際に'DisplayName', 'My Data'
のようにプロパティを設定すると、legend
関数を引数なしで呼び出すだけで自動的に凡例が作成されます(legend('AutoUpdate', 'on')
がデフォルト)。この機能を利用すると、コードがすっきりします。- 凡例の位置が悪い: 凡例がグラフの重要なデータ部分や他の要素と重なってしまい、見づらくなることがあります。
- 解決策:
legend('Location', 'best')
でMATLABに最適な位置を選ばせるか、'Location'
オプションで特定の位置(例:'northwest'
,'southwest'
など)を指定してください。あるいは、'Location', 'none'
として凡例を生成した後、Figureウィンドウ上で凡例ボックスをマウスでドラッグして手動で最適な位置に移動させることもできます。
- 解決策:
hold on
後の凡例:hold on
を使って複数のプロットを追加した場合、legend
関数は最後に一度だけ呼び出すのが一般的です。これにより、全ての線の凡例がまとめて生成されます。もし途中でlegend
を呼び出すと、それ以前の線しか凡例に表示されないことがあります。
5.4. データ形式の問題 (行列の次元、NaN値)
- ベクトルの次元不一致:
plot(x, y)
のように2つのベクトルをプロットする場合、x
とy
は同じ長さのベクトルである必要があります。もし一方が行列で他方がベクトルの場合、あるいは次元が異なる場合、MATLABはエラーを発生させるか、予期しない方法でプロットを試みることがあります。- 解決策: データのサイズ(
size(x)
,size(y)
)を確認し、必要に応じてtranspose
演算子('
)で転置したり、適切な部分を抽出したりして、次元を一致させてください。
- 解決策: データのサイズ(
- 欠損値 (NaN): MATLABは
NaN
(Not-a-Number)値をプロットしません。データにNaN
が含まれている場合、その箇所で線が途切れたり、プロットされない点が生じます。これは欠損データを視覚的に示すのに役立つ場合もありますが、もし連続した線が必要な場合は、NaN
値を補間したり、除外したりする前処理が必要です(例:y(isnan(y)) = [];
でNaNを含む要素を除去)。 - Inf値:
Inf
(無限大)値もプロット範囲外として扱われるため、軸範囲が自動調整されると非常に大きな値になり、他のデータが見えなくなることがあります。これもNaN
と同様に、必要に応じて前処理で除去または置き換えることを検討してください。
5.5. 色の選択のヒント
美しいだけでなく、理解しやすいグラフを作成するためには、適切な色の選択が不可欠です。
- カラーブラインド(色覚異常)に配慮: 全ての人が同じように色を区別できるわけではありません。色だけに頼って情報を区別しようとすると、一部のユーザーには伝わりにくくなる可能性があります。
- 解決策: 色だけでなく、線種(実線、破線、点線など)、マーカーの種類(丸、四角、三角など)、または線の太さも使い分けて、情報を多角的に区別できるようにしましょう。また、MATLABの標準カラーマップには、色覚多様性に配慮して設計されたものもあります(例:
parula
,viridis
)。
- 解決策: 色だけでなく、線種(実線、破線、点線など)、マーカーの種類(丸、四角、三角など)、または線の太さも使い分けて、情報を多角的に区別できるようにしましょう。また、MATLABの標準カラーマップには、色覚多様性に配慮して設計されたものもあります(例:
- MATLABのデフォルトカラー: MATLABのR2014b以降のデフォルトカラーパレットは、見やすく、区別しやすいように設計されています。特別な理由がなければ、これらのデフォルトカラーサイクルを積極的に活用しましょう。多くの人が慣れ親しんだ色で、視認性が高いです。
- カラーマップの選択:
colormap
関数で設定できるカラーマップは非常に豊富です。- 連続的なデータ(例: 3DプロットのZ値): 連続的な色の変化を持つ
parula
,viridis
,jet
,hot
,cool
などが適しています。 - 離散的なデータ(例: 棒グラフのカテゴリ): 色のコントラストがはっきりしたカラーマップや、特定のカラーセットが適しています。
色の意味を誤解させないように注意深く選びましょう。例えば、高温・低温を表すデータには、青から赤へのグラデーション(例:cool
やカスタムカラーマップ)が直感的に理解しやすいです。
- 連続的なデータ(例: 3DプロットのZ値): 連続的な色の変化を持つ
- ウェブカラーコード (HEX): 特定の色を正確に表現したい場合や、デザインガイドラインに従う必要がある場合、
'#RRGGBB'
形式の文字列で色を指定することもできます。これはWebデザインなどで使われる形式で、RGB値の16進数表記です。例:plot(x,y, 'Color', '#FF0000')
(鮮やかな赤)。
まとめ:MATLABプロットでデータを語らせよう
お疲れ様でした!この記事では、MATLABでのプロットの基本中の基本から始まり、グラフを美しく見せるための詳細なカスタマイズ方法、多様なグラフタイプの作成、さらにはプロットの高度なプログラム操作と高品質なエクスポート方法、そしてよくある問題とそのトラブルシューティングまで、MATLABプロットに関する包括的な知識を習得しました。
MATLABのプロット機能は、単にデータを視覚化するツールではありません。それは、あなたが分析したデータから得られた複雑な情報や洞察を、明確かつ説得力のある形で他者に伝えるための強力な言語です。今回学んだ知識とスキルを活用することで、あなたの研究、解析、またはプロジェクトの成果がより輝きを増し、聴衆や読者に対して深い印象を与えることができるでしょう。
MATLABプロット学習の次のステップ
- 実践あるのみ: 学んだことを定着させる最も効果的な方法は、実際に手を動かすことです。ご自身のデータや、インターネット上で公開されている様々なデータセットを使って、今回学んだプロットの種類やカスタマイズ方法を繰り返し試してみてください。試行錯誤を繰り返すことで、MATLABプロットのスキルは飛躍的に向上します。
- MATLABドキュメンテーションの活用: MATLABの公式ドキュメンテーション(ヘルプ)は非常に充実しており、ほとんどの関数には豊富な例と詳細な説明が記載されています。困ったときや、さらに高度な機能を知りたいときは、MATLABのコマンドウィンドウで
doc plot
やdoc axes
のように関数名を入力して調べてみましょう。インターネット上でも、”MATLAB plot tutorial”や”MATLAB custom colormap”といったキーワードで検索すると、多くの有用な情報が見つかります。 - より高度なプロットテクニックの探求:
- ライブスクリプトとライブエディタ: MATLABのライブスクリプト (
.mlx
ファイル) を使うと、コード、その出力、書式付きテキスト、数式、画像などを組み合わせたインタラクティブなドキュメントを作成できます。プロットの作成過程や分析結果を共有するのに最適です。 - プロットのイベントとコールバック: ユーザーの操作(マウスのクリック、ドラッグ、キーボード入力など)に応じてプロットを動的に変更する「コールバック」機能を使えば、インタラクティブなデータ探索ツールやカスタムアプリケーションを作成できます。
- カスタムカラーマップ: 組み込みのカラーマップだけでなく、独自のカラーマップを作成したり、MATLAB Central File Exchangeなどのコミュニティから提供されている
brewermap
などのツールボックスを利用して、より洗練されたカラーマップを適用することも可能です。 - 統計プロットとデータサイエンスツールボックス:
boxplot
,violinplot
,geobubble
など、統計分析や特定分野のデータ可視化に特化したプロット関数も多数存在します。データサイエンスツールボックスなどのアドオンを導入することで、さらに多くのプロットオプションが利用可能になります。 - App Designer: MATLABのGUI開発環境であるApp Designerを使えば、プロット機能を組み込んだ独自のアプリケーションを、コーディングの負担を少なくして開発することができます。
- ライブスクリプトとライブエディタ: MATLABのライブスクリプト (
MATLABプロットの世界は奥深く、常に新しい機能や表現方法が追加されています。このガイドが、あなたのMATLABスキルアップの確かな第一歩となり、データを深く理解し、効果的に伝えるための強力な武器となることを心から願っています。美しいグラフで、あなたのデータを存分に語らせてください!