Matlabプロットの軸範囲設定:xlim/ylimコマンド詳解


Matlabプロットの軸範囲設定:xlim/ylimコマンド詳解

Matlabを使ったデータ解析と可視化において、プロットは結果を直感的に理解するための最も強力なツールの一つです。しかし、単にデータをプロットするだけでは、意図した情報を正確に伝えられない場合があります。特に、表示するデータの範囲を適切に設定することは、プロットのメッセージ性を高め、見る人に誤解を与えないために非常に重要です。

Matlabでは、プロットのX軸とY軸の表示範囲を設定するために、主にxlimコマンドとylimコマンドを使用します。これらのコマンドを使いこなすことで、データの特定の部分を強調したり、グラフの見た目を整えたり、複数のグラフ間で比較を容易にしたりすることが可能になります。

この記事では、xlimおよびylimコマンドの基本的な使い方から、詳細な機能、応用例、そして関連するプロパティやコマンドとの連携について、約5000語にわたって徹底的に解説します。

1. なぜ軸範囲設定が重要なのか?

データに基づいてグラフを作成すると、Matlabは自動的にデータの最小値から最大値を含む範囲で軸を設定します。しかし、この自動設定が常に最適とは限りません。

  • 特定の範囲を強調したい: データ全体の傾向よりも、特定の範囲での変化や挙動に注目させたい場合があります。例えば、ある閾値を超える部分だけを見やすく表示したい、といったケースです。
  • ノイズや外れ値の影響を排除したい: データにノイズや大きな外れ値が含まれている場合、自動設定された軸範囲はそれらの値に合わせて非常に広くなり、主要なデータの変動が見えにくくなることがあります。適切な軸範囲を設定することで、主要なデータを拡大して表示できます。
  • 複数のグラフを比較したい: 異なるデータセットや異なる条件での結果を複数のグラフで比較する場合、軸の範囲を統一することで、視覚的な比較が容易になります。軸範囲が異なると、同じ変化量でも傾きが異なって見えたりして、誤解を招く可能性があります。
  • 見栄えを整えたい: 軸の余白を調整したり、特定の基準点(例えば原点)を含めたりすることで、グラフ全体のバランスを整え、よりプロフェッショナルな見た目にできます。

xlimコマンドはX軸(横軸)の表示範囲を、ylimコマンドはY軸(縦軸)の表示範囲を設定するために使用します。これらは非常に基本的でありながら、プロットの品質を大きく左右する重要な機能です。

2. xlim/ylimの基本

xlimおよびylimコマンドの最も基本的な使い方は、引数として2要素のベクトルを指定することです。このベクトルは、それぞれ軸の最小値と最大値を表します。

基本的な構文:

matlab
xlim([min_value max_value]);
ylim([min_value max_value]);

ここで、min_valueは軸の最小値、max_valueは軸の最大値です。

例1: 簡単なプロットでの軸範囲設定

ランダムなデータをプロットし、その後に軸範囲を設定してみましょう。

“`matlab
% データの生成
x = linspace(0, 2pi, 100);
y = sin(x) + randn(size(x))
0.1; % ノイズを付加

% 元のプロット (Matlabが自動で軸範囲を設定)
figure;
plot(x, y);
title(‘元のプロット (自動軸範囲)’);
xlabel(‘X’);
ylabel(‘Y’);
grid on;

% 軸範囲を設定したプロット
figure;
plot(x, y);
title(‘軸範囲を設定したプロット’);
xlabel(‘X’);
ylabel(‘Y’);
grid on;

% X軸の範囲を [pi/2, 3pi/2] に設定
xlim([pi/2, 3
pi/2]);

% Y軸の範囲を [-1.5, 1.5] に設定 (データのsin成分は-1から1の範囲なので、少し余白を持たせる)
ylim([-1.5, 1.5]);
“`

この例では、xlim([pi/2, 3*pi/2])によってX軸が約1.57から約4.71の範囲に、ylim([-1.5, 1.5])によってY軸が-1.5から1.5の範囲に限定されます。これにより、sin(x)の主要な変動部分を拡大して見ることができます。元のプロットでは、ノイズやデータの端点によってY軸の範囲が自動で決定されていましたが、手動で設定することでより見やすい範囲に調整できます。

3. 現在の軸範囲の取得とモード設定

xlimylimコマンドは、範囲を設定するだけでなく、現在の軸範囲を取得したり、軸範囲の自動・手動設定モードを切り替えたりするためにも使用できます。

現在の軸範囲を取得:

引数なしでxlimまたはylimを実行すると、現在のAxesオブジェクトの軸範囲を返します。

“`matlab
current_xlim = xlim; % 現在のX軸範囲 [min max] を取得
current_ylim = ylim; % 現在のY軸範囲 [min max] を取得

disp([‘現在のX軸範囲: ‘, num2str(current_xlim)]);
disp([‘現在のY軸範囲: ‘, num2str(current_ylim)]);
“`

これは、現在の軸範囲を記録しておきたい場合や、現在の範囲に基づいて新しい範囲を計算したい場合などに役立ちます。

軸範囲のモード設定:

xlimおよびylimは、軸範囲の設定モードを指定する文字列引数を取ることもできます。

  • 'auto': 軸範囲をデータの最小値と最大値に基づいて自動的に設定します。これがデフォルトのモードです。新しいデータをプロットしたり、既存のプロットにデータを追加したりすると、軸範囲は自動的に再計算される可能性があります。
  • 'manual': 現在の軸範囲を固定し、データの変更によっては自動的に更新されないようにします。xlim([min max])ylim([min max])のように明示的に軸範囲を設定すると、自動的にこのモードになります。
  • 'mode': 現在の軸範囲モード(’auto’または’manual’)を返します。

構文:

“`matlab
xlim(‘auto’); % X軸範囲を自動設定モードに戻す
ylim(‘auto’); % Y軸範囲を自動設定モードに戻す

xlim(‘manual’); % 現在のX軸範囲を固定する (既にmanualの場合は何もしない)
ylim(‘manual’); % 現在のY軸範囲を固定する (既にmanualの場合は何もしない)

x_mode = xlim(‘mode’); % X軸範囲モードを取得 (‘auto’ または ‘manual’)
y_mode = ylim(‘mode’); % Y軸範囲モードを取得 (‘auto’ または ‘manual’)
“`

例2: 自動モードと手動モードの切り替え

最初のプロットの後、範囲を手動で設定し、その後自動モードに戻してみましょう。

“`matlab
x = linspace(0, 2*pi, 100);
y = sin(x);

figure;
plot(x, y);
title(‘モード切り替えの例’);
xlabel(‘X’);
ylabel(‘Y’);
grid on;

% 初期状態 (autoモード)
disp([‘初期 X軸モード: ‘, xlim(‘mode’)]); % おそらく ‘auto’

% 軸範囲を手動で設定 (manualモードになる)
xlim([pi/2, 3*pi/2]);
ylim([-1.2, 1.2]);
disp([‘設定後 X軸モード: ‘, xlim(‘mode’)]); % ‘manual’ になっているはず

% 新しいデータを追加してみる (manualモードなので軸範囲は変わらないはず)
hold on; % 同じAxesにプロットを追加
plot(x, cos(x)*0.5, ‘r–‘);
hold off;
title(‘データを追加したが軸範囲は固定’);

% 軸範囲を自動モードに戻す
xlim(‘auto’);
ylim(‘auto’);
title(‘軸範囲を自動モードに戻した’);
disp([‘自動モードに戻した後 X軸モード: ‘, xlim(‘mode’)]); % ‘auto’ に戻っているはず

% 自動モードに戻ったので、新しいデータを含めた範囲に再調整される
“`

この例からわかるように、'manual'モードは意図しない軸範囲の変更を防ぐのに役立ちます。一方、'auto'モードは、プロットされるデータが動的に変化する場合や、常にデータ全体を表示したい場合に便利です。

4. 特定のAxesオブジェクトに対する設定

デフォルトでは、xlimylimコマンドは現在のAxesオブジェクトに対して操作を行います。複数のAxesオブジェクト(例えばsubplotで作成された Axes)が存在する場合、どのAxesに対して操作を行うかを明示的に指定する必要があります。

コマンドの最初の引数として、対象となるAxesオブジェクトのハンドルを指定します。

構文:

“`matlab
ax = gca; % 現在のAxesオブジェクトのハンドルを取得
xlim(ax, [min_value max_value]); % そのAxesのX軸範囲を設定
ylim(ax, [min_value max_value]); % そのAxesのY軸範囲を設定

ax1 = subplot(1, 2, 1); % 1×2のグリッドの左側のAxesを作成
plot(ax1, x, y);
xlim(ax1, [0, pi]); % 左側のAxesのX軸範囲を設定

ax2 = subplot(1, 2, 2); % 1×2のグリッドの右側のAxesを作成
plot(ax2, y, x);
ylim(ax2, [0, pi]); % 右側のAxesのY軸範囲を設定 (この例ではX軸とY軸を入れ替えている)
“`

例3: subplotでの個別設定

“`matlab
x = linspace(0, 4*pi, 200);
y1 = sin(x);
y2 = cos(x);

figure;

% 左側のサブプロット
ax1 = subplot(1, 2, 1);
plot(ax1, x, y1);
title(ax1, ‘Sin(x)’);
xlabel(ax1, ‘X’);
ylabel(ax1, ‘Y’);
grid(ax1, ‘on’);

% 右側のサブプロット
ax2 = subplot(1, 2, 2);
plot(ax2, x, y2, ‘r’);
title(ax2, ‘Cos(x)’);
xlabel(ax2, ‘X’);
ylabel(ax2, ‘Y’);
grid(ax2, ‘on’);

% 左側のサブプロットの軸範囲を設定
xlim(ax1, [0, 2*pi]);
ylim(ax1, [-1.5, 1.5]);

% 右側のサブプロットの軸範囲を設定 (異なる範囲に)
xlim(ax2, [pi, 3*pi]);
ylim(ax2, [-2, 2]);
“`

このように、Axesハンドルを渡すことで、複数のプロットがある場合でも、それぞれのプロットに対して独立して軸範囲を設定できます。これは、カスタマイズされたレイアウトを作成する際に非常に重要です。

5. 応用例と高度な使い方

xlimおよびylimコマンドは、基本的な範囲設定以外にも様々なシナリオで活用できます。

5.1. 軸の反転

軸範囲を降順で指定すると、軸を反転させることができます。

“`matlab
x = 1:10;
y = x.^2;

figure;
plot(x, y);
title(‘反転Y軸’);
xlabel(‘X’);
ylabel(‘Y’);
grid on;

% Y軸を反転 (最大値から最小値を指定)
ylim([max(y), min(y)]); % または ylim([100, 0])
“`

特に、地質学的な深さ(地表が0で下に行くほど値が増える)や、圧力(値が高いほど「低い」位置を示す)など、特定の分野では軸の反転が一般的な表現方法となる場合があります。

5.2. 対数スケールでの軸範囲設定

軸を対数スケールに設定している場合でも、xlimおよびylimで範囲を指定できます。ただし、対数スケールでは非正の値(0や負の数)はプロットできないため、指定する範囲は正の値である必要があります。

軸を対数スケールにするには、set(gca, 'XScale', 'log')set(gca, 'YScale', 'log')、あるいは xscale('log'), yscale('log') コマンドを使用します。

“`matlab
x = logspace(0, 2, 100); % 1から100までの対数的に等間隔な100点
y = 10.^x;

figure;
loglog(x, y); % x軸もy軸も対数スケールでプロット
title(‘対数スケールプロット’);
xlabel(‘X (log)’);
ylabel(‘Y (log)’);
grid on;

% 対数スケールでの軸範囲設定
% X軸を10^0.5から10^1.5の範囲に
xlim([10^0.5, 10^1.5]); % または xlim([sqrt(10), 10*sqrt(10)])
% Y軸を10^1から10^3の範囲に
ylim([10, 1000]);
“`

対数スケールで軸範囲を設定する場合、指定する値はリニアな値であることに注意してください。Matlabがそれを対数スケール上の位置にマッピングします。例えば xlim([10, 100]) は、対数スケールで10¹から10²の範囲を意味します。

5.3. 時間データでの軸範囲設定

Matlabの新しいバージョンでは、時間データをdatetime型で扱うことができます。xlimylimは、datetime型の軸に対しても使用できます。範囲を指定する際も、datetimeオブジェクトまたはdatetimeの範囲を表す2要素セル配列を使用します。

“`matlab
% 時間データの生成
startTime = datetime(‘2023-01-01 00:00:00’);
endTime = datetime(‘2023-01-01 23:59:59’);
timeVec = linspace(startTime, endTime, 2460); % 1分間隔のタイムスタンプ
data = sin(linspace(0, 4
pi, numel(timeVec))); % 時間に対応するデータ

figure;
plot(timeVec, data);
title(‘時間データのプロット’);
xlabel(‘時間’);
ylabel(‘値’);
grid on;

% 特定の時間範囲に設定
% 12:00から18:00の範囲を表示
xlim([datetime(‘2023-01-01 12:00:00’), datetime(‘2023-01-01 18:00:00’)]);
% またはセル配列として指定
% xlim({‘2023-01-01 12:00:00’, ‘2023-01-01 18:00:00’}); % 文字列でもOKだが datetime オブジェクトが推奨

% Y軸は通常の数値範囲で設定
ylim([-1.2, 1.2]);
“`

datetime型の軸範囲設定は、時系列データの特定の期間をクローズアップして解析したい場合に非常に便利です。

5.4. カテゴリカルデータでの軸範囲設定

軸がカテゴリカルデータである場合(categorical型を使用)、軸範囲の設定は少し異なります。xlimylimは、カテゴリカルデータの範囲を、カテゴリに対応する数値インデックスの範囲として扱います。カテゴリは通常、プロット上で1から始まる整数インデックスに対応します。

“`matlab
% カテゴリカルデータと数値データの生成
categories = categorical({‘Apple’, ‘Banana’, ‘Cherry’, ‘Date’, ‘Elderberry’});
values = [10, 25, 15, 5, 30];

figure;
bar(categories, values); % カテゴリカル軸で棒グラフを作成
title(‘カテゴリカルデータのプロット’);
xlabel(‘フルーツ’);
ylabel(‘数量’);
grid on;

% X軸のカテゴリ範囲を設定
% ‘Banana’から’Date’の範囲を表示したい場合
% これらのカテゴリはインデックス2, 3, 4に対応
xlim([1.5, 4.5]); % カテゴリ ‘Banana'(2)と’Cherry'(3)と’Date'(4)を表示するためにインデックスの間に設定

% Y軸は通常の数値範囲で設定
ylim([0, 35]);
“`

カテゴリカル軸の場合、xlim([min_idx - 0.5, max_idx + 0.5]) のように、表示したいカテゴリのインデックスの前後0.5を指定することで、そのカテゴリの棒(または点)全体が表示されるように調整するのが一般的です。

5.5. NaNを含むデータと軸範囲

データにNaN(Not a Number)が含まれている場合、plotコマンドはNaNの位置で線を切断しますが、軸範囲の自動設定はNaN以外の有限なデータポイントに基づいて行われます。手動でxlim/ylimを設定する場合も、NaNは軸範囲の計算に影響しません。

6. Axesプロパティとしての設定

xlimylimコマンドは、実際には現在のAxesオブジェクトのプロパティを変更するための便利なラッパー関数です。Axesオブジェクトには、軸範囲に関連する以下のプロパティがあります。

  • XLim: X軸の範囲を[min max]の2要素ベクトルとして格納します。
  • YLim: Y軸の範囲を[min max]の2要素ベクトルとして格納します。
  • ZLim: Z軸の範囲を[min max]の2要素ベクトルとして格納します(3Dプロットの場合)。
  • XLimMode: X軸の範囲モードを'auto'または'manual'として格納します。
  • YLimMode: Y軸の範囲モードを'auto'または'manual'として格納します。
  • ZLimMode: Z軸の範囲モードを'auto'または'manual'として格納します(3Dプロットの場合)。

これらのプロパティに直接アクセスし、値を設定することで、xlim/ylimコマンドと同じことができます。

プロパティ設定の構文:

まず、対象となるAxesオブジェクトのハンドルを取得します。

matlab
ax = gca; % 現在のAxesハンドルを取得
% または
ax = subplot(1, 1, 1); % Axesを作成しハンドルを取得
% または
figure;
ax = axes; % Axesを作成しハンドルを取得

次に、取得したハンドルのプロパティを設定します。

“`matlab
ax.XLim = [0, 10]; % X軸範囲を設定
ax.YLim = [-5, 5]; % Y軸範囲を設定

ax.XLimMode = ‘manual’; % X軸範囲モードを手動に設定
ax.YLimMode = ‘auto’; % Y軸範囲モードを自動に設定

current_xlim = ax.XLim; % X軸範囲を取得
current_ylim_mode = ax.YLimMode; % Y軸モードを取得
“`

xlim/ylimコマンドとプロパティ設定の比較:

  • 簡潔さ: 簡単なスクリプトで現在のAxesの範囲を設定するだけなら、xlim([min max])ylim('auto')のようなコマンド形式の方が簡潔です。
  • 柔軟性: プロパティ設定は、特定のAxesオブジェクト(複数ある場合など)に対して操作を行う場合に明確です。また、GUI構築など、オブジェクト指向的なアプローチでプロットを操作する場合には、プロパティに直接アクセスする方が自然で強力です。
  • 機能: xlim/ylimコマンドはプロパティ設定のラッパーなので、機能的には同等です。xlim([min max])ax.XLim = [min max]; ax.XLimMode = 'manual';とほぼ同じ挙動をします。xlim('auto')ax.XLimMode = 'auto';と同じです。

どちらを使うかは、状況と個人のコーディングスタイルによります。簡単なスクリプトではコマンド、より構造化されたコードやGUIではプロパティ設定が推奨されることが多いです。

例4: プロパティによる軸範囲設定

“`matlab
x = 0:0.1:10;
y = x.^2;

figure;
h = plot(x, y); % プロットオブジェクトのハンドル h を取得 (Axesオブジェクトではない)
ax = gca; % 現在のAxesオブジェクトのハンドルを取得

% プロパティを使って軸範囲を設定
ax.XLim = [2, 8];
ax.YLim = [0, 70]; % y=x^2 なので 2^2=4, 8^2=64 の範囲を含む

% モードを確認
disp([‘X軸モード (プロパティ): ‘, ax.XLimMode]); % ‘manual’
disp([‘Y軸モード (プロパティ): ‘, ax.YLimMode]); % ‘manual’

title(‘Axesプロパティによる軸範囲設定’);
xlabel(‘X’);
ylabel(‘Y’);
grid on;
“`

この例は、Axesオブジェクトハンドル ax を使って .XLim.YLim プロパティに直接値を代入することで軸範囲を設定できることを示しています。これにより、xlim(ax, [2, 8]) と同じ効果が得られます。

7. 軸範囲と関連機能との連携

Matlabのプロットには、軸範囲に関連するいくつかの強力な機能があります。xlim/ylimコマンドを使う際には、これらの機能との相互作用を理解しておくことが重要です。

7.1. linkaxesコマンド

linkaxesコマンドは、複数のAxesオブジェクトの軸をリンクさせるために使用されます。リンクされた軸は、一方のAxesでパン(移動)やズーム(拡大・縮小)を行うと、もう一方のAxesのリンクされた軸も同じように更新されます。

linkaxesは、リンク対象の軸の範囲も同期させます。linkaxesが呼び出された時点で、リンクされているAxesの軸範囲は、その時点での中で最も広い範囲に自動的に調整されます。その後、いずれかのAxesの軸範囲が変更されると、他のリンクされたAxesの軸範囲も同じように変更されます。

linkaxesコマンドの基本的な構文は linkaxes([ax1, ax2, ...], option) です。ここで [ax1, ax2, ...] はリンクするAxesハンドルの配列で、option'x' (X軸のみ), 'y' (Y軸のみ), 'xy' (両方, デフォルト), 'off' (リンク解除) です。

xlim/ylimlinkaxes の相互作用:

  1. linkaxes前に xlim/ylim を呼び出す: 各Axesに対して個別にxlim/ylimで範囲を設定した後、linkaxesで軸をリンクさせると、linkaxesが呼び出された時点で、各Axesで設定されていた範囲の中で最も広い範囲に合わせて全てのAxesの軸範囲が再調整されます。
  2. linkaxes後に xlim/ylim を呼び出す: linkaxesで軸がリンクされた後に、いずれか一つのAxesに対してxlimylimコマンド(またはプロパティ設定)で範囲を設定すると、その設定がリンクされている全てのAxesに反映されます。

例5: linkaxesとxlimの連携

“`matlab
x = 0:pi/20:4*pi;
y1 = sin(x);
y2 = cos(x);

figure;

% 左側のサブプロット
ax1 = subplot(1, 2, 1);
plot(ax1, x, y1);
title(ax1, ‘Sin(x)’);
xlabel(ax1, ‘X’);
ylabel(ax1, ‘Y’);
grid(ax1, ‘on’);

% 右側のサブプロット
ax2 = subplot(1, 2, 2);
plot(ax2, x, y2, ‘r’);
title(ax2, ‘Cos(x)’);
xlabel(ax2, ‘X’);
ylabel(ax2, ‘Y’);
grid(ax2, ‘on’);

% ———- リンク前の個別設定 ———-
% linkaxes([ax1, ax2], ‘x’); の前に個別設定する場合
% xlim(ax1, [0, 2pi]); % ax1 の範囲を設定
% xlim(ax2, [pi, 3
pi]); % ax2 の範囲を設定
% linkaxes([ax1, ax2], ‘x’); % リンクすると、範囲は [0, 3pi] になる (0から2piとpiから3piのunion)
% disp([‘リンク後のax1のXLim: ‘, num2str(ax1.XLim)]); % [0 3
pi] 付近
% disp([‘リンク後のax2のXLim: ‘, num2str(ax2.XLim)]); % [0 3*pi] 付近

% ———- リンク後の設定 ———-
% まずリンクする
linkaxes([ax1, ax2], ‘x’);

% リンク後にいずれか一つのAxesの範囲を設定すると、両方に反映される
xlim(ax1, [pi/2, 5*pi/2]); % ax1のX軸範囲を設定 -> ax2のX軸も同じ範囲になる

% 確認
disp([‘設定後のax1のXLim: ‘, num2str(ax1.XLim)]);
disp([‘設定後のax2のXLim: ‘, num2str(ax2.XLim)]); % ax1と同じ範囲になっているはず

% Y軸はリンクされていないので個別設定可能
ylim(ax1, [-1.2, 1.2]);
ylim(ax2, [-1.5, 1.5]);
“`

linkaxesxlim/ylimを組み合わせることで、複数のグラフの軸を簡単に同期させたり、一括で範囲を設定したりすることができます。これは、同じ軸を持つデータを複数のビューで表示する場合などに非常に有効です。

7.2. 拡大・縮小 (Pan and Zoom)

Matlabフィギュアツールバーのパンツールやズームツールを使用したり、マウスホイールを使ったりしてプロットを操作すると、Axesの表示範囲がインタラクティブに変更されます。このとき、AxesのXLim, YLim, ZLimプロパティが更新され、XLimMode, YLimMode, ZLimModeプロパティは自動的に'manual'に設定されます。

一度インタラクティブに操作して軸範囲が変更されると、そのAxesのモードは'manual'になります。その後、例えばプロットしているデータを追加したり変更したりしても、自動的に軸範囲は調整されなくなります。軸範囲を再度データに合わせて自動調整させたい場合は、明示的にxlim('auto')ylim('auto')を呼び出す必要があります。

これは、ユーザーが特定の領域にズームインして詳細を確認した後、元の自動モードに戻さない限り、そのズームされた範囲が維持されるという自然な挙動を提供します。

8. デフォルトの軸範囲決定ロジック ('auto'モード)

xlim('auto')ylim('auto')を設定した場合、あるいは最初にプロットを作成した際に自動的に設定される軸範囲は、どのように決定されるのでしょうか?

MatlabのAxesオブジェクトは、プロットされている全てのグラフィックスオブジェクト(Line, Surface, Barなど)のデータを参照し、それらのデータ点の最小値と最大値を計算します。そして、その最小値から最大値を含むように、かつ軸ラベルや目盛りがデータポイントと重ならないように、少し余裕を持たせた範囲を自動的に決定します。

この「少し余裕を持たせる」量は、AxesのXLimitMethod, YLimitMethod, ZLimitMethodプロパティによって制御されます。デフォルトでは'padded'となっており、データ範囲の5%程度の余白が上下に追加されます。これを'tight'に設定すると、データ範囲にぴったり合わせた軸範囲になります(ただし、軸ラベルなどが食い込む可能性があります)。

例6: ‘padded’ と ‘tight’ の違い

“`matlab
x = 1:10;
y = x;

figure;
ax1 = subplot(1, 2, 1);
plot(ax1, x, y, ‘o-‘);
title(ax1, ‘Padding (Default)’);
xlabel(ax1, ‘X’);
ylabel(ax1, ‘Y’);
grid(ax1, ‘on’);

% デフォルトは ‘padded’ なので、データ範囲 [1, 10] より少し広い範囲になる
disp([‘Default XLim (padded): ‘, num2str(ax1.XLim)]); % 例: [0.55 10.45]

ax2 = subplot(1, 2, 2);
plot(ax2, x, y, ‘o-‘);
title(ax2, ‘Tight’);
xlabel(ax2, ‘X’);
ylabel(ax2, ‘Y’);
grid(ax2, ‘on’);

% LimitMethod を ‘tight’ に設定
ax2.XLimitMethod = ‘tight’;
ax2.YLimitMethod = ‘tight’;

% ‘auto’ モードに戻すことで、tightな範囲が適用される
xlim(ax2, ‘auto’);
ylim(ax2, ‘auto’);

disp([‘Tight XLim: ‘, num2str(ax2.XLim)]); % 例: [1 10]
“`

XLimitMethod/YLimitMethodプロパティは、'auto'モード時の軸範囲決定に影響を与えます。通常はデフォルトの'padded'で問題ありませんが、データ範囲にぴったり合わせたい場合は'tight'が役立ちます。

9. よくある問題とトラブルシューティング

xlimylimを使っても期待通りに軸範囲が設定されない場合、いくつかの原因が考えられます。

  • 原因1: ターゲットのAxesが間違っている
    • 複数のAxesがあるのに、対象のAxesハンドルを指定せずにxlimylimを呼び出していませんか?これらのコマンドはデフォルトでgca(Current Axes)を操作します。意図したAxesがgcaになっていない可能性があります。明示的にAxesハンドルを指定 (xlim(ax, [min max])) しましょう。
  • 原因2: linkaxesの影響
    • 対象のAxesが他のAxesとlinkaxesでリンクされていませんか?リンクされている場合、xlimylimの設定はリンクされている全てのAxesに伝播するか、あるいは他のAxesの範囲によって上書きされる可能性があります(linkaxesが呼び出されたタイミングによる)。linkaxesの状態を確認するか、必要に応じてlinkaxes(..., 'off')で一度リンクを解除してから範囲を設定してください。
  • 原因3: モードが’auto’に戻っている
    • xlim([min max])などで範囲を手動設定したはずなのに、後から軸範囲が変わってしまう場合、何らかの操作(例えば新しいデータの追加や、明示的にxlim('auto')を呼び出すなど)によってモードが'auto'に戻ってしまった可能性があります。モードが'manual'になっていることを確認してください。
  • 原因4: 対数スケールでの無効な範囲
    • 対数スケールで軸範囲を設定する場合、指定する値は必ず正である必要があります。xlim([0 10])のような0を含む範囲を対数X軸に設定しようとするとエラーになるか、無視される可能性があります。最小値は0より大きい正の値を指定してください。
  • 原因5: データ型と軸範囲の不一致
    • 時間軸(datetime)やカテゴリカル軸に対して、数値の範囲を指定していませんか?時間軸にはdatetimeオブジェクトまたはその文字列表現、カテゴリカル軸には対応する数値インデックスの範囲を指定する必要があります。
  • 原因6: プロット要素の影響
    • データ点や線だけでなく、テキストラベル、凡例、矢印などのアノテーションや、他の隠れたプロット要素が自動範囲計算に影響を与えている可能性は低いですが、全くゼロではありません。特に、これらの要素が非常に遠い座標に配置されている場合は注意が必要です。

これらの問題を解決するには、以下のデバッグ手法が役立ちます。

  • 現在のAxesハンドルを確認する (gca)。
  • 現在の軸範囲を取得する (xlim, ylim, ax.XLim, ax.YLim)。
  • 現在の軸モードを確認する (xlim('mode'), ylim('mode'), ax.XLimMode, ax.YLimMode)。
  • linkaxesの状態を確認する。
  • 対数軸の場合は、ax.XScaleax.YScaleプロパティを確認する。

10. まとめ

xlimおよびylimコマンドは、Matlabでプロットの軸範囲を効果的に制御するための不可欠なツールです。基本的なxlim([min max])形式から、'auto'/’manual'モードの切り替え、特定のAxesオブジェクトへの適用、対数軸や時間軸への応用、さらにはlinkaxesコマンドとの連携まで、その機能は多岐にわたります。

  • 基本: xlim([min max]), ylim([min max]) で範囲を指定。
  • 情報取得: xlim, ylim (引数なし) で現在の範囲を取得。
  • モード: xlim('auto'), ylim('auto') で自動設定モードに戻す。xlim('manual'), ylim('manual') で手動設定モードに固定する。xlim('mode'), ylim('mode') で現在のモードを確認。
  • 複数Axes: Axesハンドルを最初の引数として指定 (xlim(ax, [min max]))。
  • プロパティ: ax.XLim, ax.YLim, ax.XLimMode, ax.YLimMode プロパティで直接設定・取得することも可能。
  • 応用: 範囲の反転 (xlim([max min]))、対数軸、時間軸、カテゴリカル軸への適用も可能。
  • 連携: linkaxesコマンドとの連携により、複数の軸範囲を同期させることができる。パンやズーム操作も軸範囲とモードに影響する。

効果的なデータ可視化のためには、単にデータをプロットするだけでなく、軸の範囲を適切に設定することが重要です。データ全体の概観を示すべきか、特定の関心領域を拡大すべきか、複数のプロット間で比較を容易にすべきかなど、目的によって最適な軸範囲は異なります。xlimylimコマンドをマスターし、意図を正確に伝えるプロットを作成できるようになりましょう。

この記事が、あなたのMatlabプロットにおける軸範囲設定の理解を深め、より高品質な可視化を実現するための一助となれば幸いです。


コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール