Octaveで思い通りのグラフを!「orient」コマンドでページの向きと凡例を操る

2025-05-27

Octaveプログラミングにおける"orient"は、主にグラフィックスの印刷(または保存)時のページの向き、あるいはグラフの凡例(legend)の配置を指定するために使用されます。

ページの向き (print/save functions)

orient コマンドは、グラフを印刷したりPDFなどのページ形式で保存したりする際に、ページの向き(縦向きか横向きか)を設定するために使われます。これは、Matlabの orient コマンドと同様の機能です。

  • orient("tall"): ページを縦向きに設定し、プロットがページ全体に広がるように調整します。
  • orient("landscape"): ページを横向き(ランドスケープ)にします。グラフの幅が高さよりも大きくなるように設定されます。
  • orient("portrait"): ページを縦向き(ポートレート)にします。これがデフォルトです。

これらの設定は、print コマンドでグラフをファイルに出力する際に特に重要です。例えば、グラフを横向きのPDFとして保存したい場合などに利用します。

figure(1);
plot(rand(10));
orient("landscape"); % ページを横向きに設定
print("my_plot_landscape.pdf", "-dpdf"); % PDFとして保存

legend 関数に orient オプションを渡すことで、凡例内の要素(凡例のキーとテキスト)を縦に並べるか横に並べるかを指定できます。

  • legend(..., "orient", "horizontal"): 凡例の要素を横に並べます。
  • legend(..., "orient", "vertical"): 凡例の要素を縦に並べます(デフォルト)。

例:

x = 0:0.1:2*pi;
plot(x, sin(x), "r", x, cos(x), "b");
legend("sin(x)", "cos(x)", "orient", "horizontal"); % 凡例を横並びに

Octaveにおけるorientは、文脈によって以下の2つの主要な意味を持ちます。

  • 凡例の要素の並び: legend コマンドのオプションとして、凡例内の項目を縦または横に配置することを制御します。
  • グラフィック出力のページ向き: print コマンドに関連して、印刷や保存されるページの向き(縦・横)を制御します。


ページの向き (orient("portrait"|"landscape"|"tall")) に関するエラーとトラブルシューティング

よくあるエラー/問題:

  • print コマンドとの連携がうまくいかない
    • print コマンドで適切なオプション(例: -dpdf)を使っていないため、orient の設定が無視される。
  • 設定が反映されない
    • orient を実行したが、次にグラフを出力しても変更がないように見える。
  • グラフが期待通りの向きで出力されない
    • 例: orient("landscape") を設定したのに、出力されたPDFが縦向きになっている。

トラブルシューティング:

  1. orient コマンドが print コマンドの前に実行されているか確認する: orient の設定は、その後に実行される print コマンドに適用されます。グラフを生成し、orient を設定してから print を実行する順番が重要です。

    figure(1);
    plot(rand(10));
    orient("landscape"); % ここで設定
    print("my_plot.pdf", "-dpdf"); % 設定が適用される
    
  2. print コマンドで適切なデバイスドライバを使用しているか確認する: orient の設定は、PostScriptベースのドライバ(-dps, -dpsc, -deps, -depsc など)やPDFドライバ(-dpdf)で最も効果的に機能します。画像フォーマット(-dpng, -djpeg など)では、ページの概念がないため orient は直接的な影響を与えない場合があります。

    % PDF出力でorientが有効
    print("my_plot_landscape.pdf", "-dpdf");
    
  3. 既存のFigureウィンドウに対して設定しているか確認する: orient は、現在アクティブなFigureに対して作用します。複数のFigureを扱っている場合は、目的のFigureがアクティブになっていることを確認するか、figure(h) でハンドルを指定してから orient を実行することを検討してください。

    h = figure(1); % Figure 1を生成
    plot(rand(10));
    orient(h, "landscape"); % Figure 1に対して設定
    print(h, "my_plot.pdf", "-dpdf");
    
  4. Octaveのバージョンを確認する: ごく古いバージョンのOctaveでは、orient の動作が不安定だったり、一部の機能が不足していたりする可能性があります。最新の安定版を使用することを検討してください。

  5. Ghostscriptのインストールを確認する: OctaveがPDFやPostScriptファイルを生成する際、内部的にGhostscriptを利用しています。Ghostscriptが正しくインストールされていないか、パスが通っていない場合、print コマンドが正しく機能せず、結果的に orient の設定が反映されないことがあります。

    • コマンドラインで gs と入力して、Ghostscriptが起動するか確認してみてください。
    • 起動しない場合は、Ghostscriptをインストールし、システムパスに追加する必要があります。
  6. gset を使った代替方法: 稀に orient が期待通りに動作しない場合、低レベルのグラフィックス設定である gset を使って用紙の向きを直接設定することも可能です。ただし、これは通常推奨される方法ではありません。

    gset paperorientation "landscape"
    
  • legend 関数の引数エラー
    • "orient" オプションのスペルミスや、引数の位置が間違っている。
  • 凡例が横並びにならない(または縦並びにならない)
    • "orient", "horizontal" を指定したのに、凡例が縦に並んだままになる。
  1. "orient" オプションが正しく指定されているか確認する: "orient" は文字列として、その後に "horizontal" または "vertical" の文字列が続く必要があります。

    % 正しい例
    legend("Series A", "Series B", "orient", "horizontal");
    
    % 間違いの例(スペルミスや引数不足)
    % legend("Series A", "Series B", "orient", horizontal); % horizontalが変数とみなされる
    % legend("Series A", "Series B", "orien", "horizontal"); % スペルミス
    
  2. Octaveのバージョンを確認する: 凡例の orient オプションは、比較的新しいバージョンのOctaveで導入された機能です。非常に古いバージョンのOctaveを使用している場合、このオプションがサポートされていない可能性があります。その場合、凡例の配置は自動的に決定されるか、他のオプション("location" など)で調整する必要があります。

  3. 凡例の要素が多すぎる場合: たとえ "horizontal" を指定しても、凡例の要素が非常に多い場合、グラフの描画領域に収まらないために、Octaveが自動的に複数行に折り返すことがあります。これはエラーではなく、見やすさを保つための挙動です。この場合、凡例の配置場所("location" オプション)を変更するか、凡例の項目数を減らすことを検討してください。

    % 凡例の場所も調整してみる
    legend("A", "B", "C", "D", "E", "F", "orient", "horizontal", "location", "southoutside");
    


グラフ出力のページの向きを制御する orient の例

このorientは、主にprintコマンドと組み合わせて、生成されるPDFやPostScriptファイルのページの向き(縦または横)を制御します。

例 1: 縦向き (Portrait) でグラフをPDFとして保存する

これがデフォルトの向きです。明示的に指定する場合。

% グラフのデータを準備
x = linspace(0, 2*pi, 100);
y = sin(x);

% Figureを作成し、プロット
figure(1);
plot(x, y, 'b-', 'linewidth', 2);
title('Sin Wave (Portrait)');
xlabel('X-axis');
ylabel('Y-axis');
grid on;

% ページの向きを縦向きに設定 (デフォルトですが、明示的に指定)
orient("portrait");

% PDFとして保存
% -dpdf オプションでPDF形式を指定
% -S オプションは、プロットのサイズをスクリーンに合わせる(多くの場合、綺麗に出力される)
print("sin_wave_portrait.pdf", "-dpdf", "-S");

disp('縦向きのPDFファイル "sin_wave_portrait.pdf" が生成されました。');

例 2: 横向き (Landscape) でグラフをPDFとして保存する

グラフが横長の場合や、広い表示領域が必要な場合に便利です。

% グラフのデータを準備
x = linspace(0, 4*pi, 100);
y1 = sin(x);
y2 = cos(x);

% Figureを作成し、プロット
figure(2);
plot(x, y1, 'r-', 'linewidth', 1.5, 'displayname', 'sin(x)');
hold on;
plot(x, y2, 'g--', 'linewidth', 1.5, 'displayname', 'cos(x)');
hold off;
title('Sin and Cos Waves (Landscape)');
xlabel('X-axis');
ylabel('Y-axis');
legend('location', 'southoutside'); % 凡例を下部に配置
grid on;

% ページの向きを横向きに設定
orient("landscape");

% PDFとして保存
print("sin_cos_waves_landscape.pdf", "-dpdf", "-S");

disp('横向きのPDFファイル "sin_cos_waves_landscape.pdf" が生成されました。');

例 3: Tall モードでグラフをPDFとして保存する

"tall" オプションは、プロットエリアがページ全体に広がるように調整され、縦向きのページでグラフを最大限に活用したい場合に役立ちます。

% グラフのデータを準備
t = 0:0.1:10;
z = exp(-0.1*t) .* sin(t);

% Figureを作成し、プロット
figure(3);
plot(t, z, 'm-o', 'markersize', 4, 'linewidth', 1.2);
title('Damped Sine Wave (Tall)');
xlabel('Time');
ylabel('Amplitude');
grid on;

% ページの向きをTallに設定
orient("tall");

% PDFとして保存
print("damped_sine_tall.pdf", "-dpdf", "-S");

disp('TallモードのPDFファイル "damped_sine_tall.pdf" が生成されました。');

このorientは、legend関数のオプションとして使用され、凡例内の項目を縦に並べるか横に並べるかを指定します。

例 4: 凡例を縦に配置する (デフォルト)

明示的に指定する場合の例です。

% グラフのデータを準備
x = 0:0.1:2*pi;
y_sin = sin(x);
y_cos = cos(x);
y_tan = tan(x); % tanは範囲外になるので注意

% Figureを作成し、プロット
figure(4);
plot(x, y_sin, 'b', 'displayname', 'Sin(x)');
hold on;
plot(x, y_cos, 'r', 'displayname', 'Cos(x)');
plot(x, y_tan, 'g--', 'displayname', 'Tan(x)'); % tanは垂直線が入るので注意
hold off;
ylim([-2, 2]); % Y軸の範囲を限定して見やすくする
title('Functions with Vertical Legend');
xlabel('X');
ylabel('Y');

% 凡例を縦に配置 (デフォルトですが、明示的に指定)
% location オプションで凡例の位置も指定
legend("orient", "vertical", "location", "northeast");

disp('凡例が縦に配置されたグラフが表示されました。');

例 5: 凡例を横に配置する

複数の項目がある凡例をコンパクトに表示したい場合に非常に役立ちます。

% グラフのデータを準備
t = 0:0.5:10;
data1 = t.^2;
data2 = t.^1.5;
data3 = log(t+1) * 10;
data4 = exp(t/5);

% Figureを作成し、プロット
figure(5);
plot(t, data1, 's-', 'displayname', 'Quadratic');
hold on;
plot(t, data2, 'o--', 'displayname', 'Power 1.5');
plot(t, data3, 'x:', 'displayname', 'Logarithmic');
plot(t, data4, 'd-.', 'displayname', 'Exponential');
hold off;
title('Data Trends with Horizontal Legend');
xlabel('Time');
ylabel('Value');
grid on;

% 凡例を横に配置し、グラフの下部に表示
% location オプションで 'southoutside' を指定すると、グラフエリアの外側に配置される
legend("orient", "horizontal", "location", "southoutside");

disp('凡例が横に配置されたグラフが表示されました。');


グラフ出力のページの向き(orient("portrait"|"landscape"|"tall"))の代替方法

orient コマンドは、print コマンドと組み合わせてページの向きを設定しますが、print コマンド自体にも同様の機能を持つオプションがあります。

代替方法 1: print コマンドの-portrait または -landscape オプションを使用する

print コマンドには、直接ページの向きを指定するオプションがあります。これは orient を呼び出すのとほぼ同じ効果を持ちます。

% グラフの作成
figure(1);
plot(rand(10));
title('Plot using print -landscape option');
xlabel('X');
ylabel('Y');

% 横向きでPDFとして保存
% -landscape オプションがページの向きを設定
print("my_plot_alt_landscape.pdf", "-dpdf", "-landscape");

disp('代替方法1: print -landscape を使用してPDFが生成されました。');

% 縦向きでPDFとして保存 (デフォルトですが、明示的に指定する場合)
figure(2);
plot(sin(linspace(0, 2*pi, 50)));
title('Plot using print -portrait option');
print("my_plot_alt_portrait.pdf", "-dpdf", "-portrait");

disp('代替方法1: print -portrait を使用してPDFが生成されました。');

利点: コマンドラインが1つで済むため、簡潔です。

注意点: -tall に直接対応する print オプションはありません。-tall の効果を得たい場合は、orient("tall") を使うか、グラフサイズを細かく調整する必要があります。

代替方法 2: set(gcf, 'PaperOrientation', ...) を使用する

低レベルのグラフィックスハンドルプロパティを直接操作する方法です。gcf は現在のFigureのハンドルを取得します。

% グラフの作成
figure(3);
plot(exp(-linspace(0, 5, 50)));
title('Plot using set(gcf, PaperOrientation)');
xlabel('Time');
ylabel('Decay');

% FigureのPaperOrientationプロパティを 'landscape' に設定
set(gcf, 'PaperOrientation', 'landscape');

% PDFとして保存
print("my_plot_alt_set_landscape.pdf", "-dpdf");

disp('代替方法2: set(gcf, ''PaperOrientation'') を使用してPDFが生成されました。');

設定可能な値は 'portrait' (デフォルト) と 'landscape' です。

利点: より低レベルで、プログラム的に柔軟に設定したい場合に役立ちます。orient コマンドが何をしているかを理解するのにも役立ちます。

注意点: orient("tall") の効果は、このプロパティだけでは実現できません。

代替方法 3: set(gcf, 'PaperType', ...)set(gcf, 'PaperSize', ...) と組み合わせて調整する

非常に細かく用紙サイズやプロット領域を制御したい場合、用紙の種類やサイズを直接設定することで、結果的に出力の向きやレイアウトを調整できます。これは orient の直接的な代替というよりは、より高度なレイアウト制御です。

% グラフの作成
figure(4);
x = 0:0.1:10;
plot(x, sin(x) + cos(x));
title('Custom Paper Size and Orientation');
xlabel('X');
ylabel('Y');

% 用紙の種類をA4に設定
set(gcf, 'PaperType', 'A4');
% 用紙の向きを明示的に横向きに設定
set(gcf, 'PaperOrientation', 'landscape');

% 用紙サイズをカスタムで設定することも可能 (例: [幅 高さ] in inches)
% set(gcf, 'PaperSize', [11, 8.5]); % レターサイズを横向きに

% PDFとして保存
print("my_plot_custom_paper.pdf", "-dpdf");

disp('代替方法3: カスタム用紙設定でPDFが生成されました。');

利点: 印刷時の正確なレイアウト調整が必要な場合に、最も柔軟な制御が可能です。

凡例の配置に関しては、"orient" オプションが最も直接的で推奨される方法ですが、古いOctaveバージョンや、より複雑なカスタムレイアウトが必要な場合に代替手段を検討することもあります。

代替方法: legend 関数の他のオプションで調整する

"orient" オプションがない古いバージョンでは、凡例の配置を調整するために"location" オプションを工夫したり、複数のtext オブジェクトを使って手動で凡例を配置したりすることが考えられます。

% グラフの作成
x = 0:0.1:2*pi;
y1 = sin(x);
y2 = cos(x);
y3 = sin(x) + cos(x);

figure(5);
plot(x, y1, 'r', 'displayname', 'Sin(x)');
hold on;
plot(x, y2, 'g', 'displayname', 'Cos(x)');
plot(x, y3, 'b', 'displayname', 'Sin+Cos(x)');
hold off;
title('Legend without "orient" (old version)');
xlabel('X');
ylabel('Y');

% "orient" オプションが使えない場合、"location" オプションで調整
% 例えば、"southoutside" は凡例をグラフの下に横並びに配置しようと試みる
legend("Sin(x)", "Cos(x)", "Sin+Cos(x)", "location", "southoutside");

disp('代替方法: legend の location オプションで凡例の配置を調整しました。');

% さらに複雑な場合は、手動で凡例を作成することも考えられる (非常に稀なケース)
% これは非常に手間がかかるため、通常は推奨されません。
% text(x_coord, y_coord, 'Sin(x)', 'Color', 'r', 'VerticalAlignment', 'middle');
% line([x_coord-0.05 x_coord+0.05], [y_coord y_coord], 'Color', 'r');
% ... のように、個々の要素を描画する

利点: 古いOctaveバージョンで動作する可能性があります。