Octave scatter3で美しい3D可視化!データ分析を強力サポート

2025-04-26

基本的な使い方

scatter3(x, y, z)
  • x, y, z: それぞれ、x座標、y座標、z座標のデータを含むベクトルまたは行列です。これらのベクトルの長さは同じである必要があります。

オプション

scatter3関数には、さまざまなオプションがあり、プロットの外観をカスタマイズできます。

  • マーカーの形状

    • マーカーの形状は、'o' (円), '+' (プラス記号), 'x' (バツ記号), '*' (アスタリスク), '.' (点) などで指定できます。
    • 例: scatter3(x, y, z, 'x') は、バツ記号のマーカーでプロットします。
    • scatter3(x, y, z, s): マーカーのサイズ s を指定します。s はスカラーまたは x, y, z と同じ長さのベクトルです。
    • scatter3(x, y, z, c): マーカーの色 c を指定します。c は色指定の文字列(例: 'r' (赤), 'b' (青))または RGB トリプレット(例: [1 0 0] (赤))または x, y, z と同じ長さのベクトルです。
    • 例: scatter3(x, y, z, 50, 'g') は、サイズ 50 の緑色のマーカーでプロットします。


% 3次元のランダムなデータを作成
x = rand(1, 50);
y = rand(1, 50);
z = rand(1, 50);

% 散布図を描画
scatter3(x, y, z, 70, 'r', 'filled');

% 軸ラベルとタイトルを追加
xlabel('X軸');
ylabel('Y軸');
zlabel('Z軸');
title('3次元散布図');

%グリッドを追加
grid on;

この例では、50個のランダムな3次元データ点を赤い塗りつぶされた円でプロットし、軸ラベルとタイトルを追加しています。



よくあるエラーとトラブルシューティング

    • エラー
      error: scatter3: X, Y, and Z must be the same size
    • 原因
      scatter3(x, y, z) を使うとき、x, y, z のベクトルまたは行列のサイズが一致していない。
    • 解決策
      size(x), size(y), size(z) を使ってそれぞれのサイズを確認し、必要に応じてリサイズやデータの修正を行う。
  1. 色の指定が間違っている

    • エラー
      error: scatter3: invalid color specification
    • 原因
      色の指定がOctaveで認識されない形式になっている。例えば、文字列で色を指定する際にスペルミスがあったり、RGBトリプレットの範囲が間違っている(0から1の範囲外)。
    • 解決策
      • Octaveで有効な色指定('r', 'g', 'b', 'k', 'y', 'm', 'c', または [R G B])を使用する。
      • 色の指定を文字列で行う場合は、スペルミスがないか確認する。
      • RGBトリプレットの場合は、各要素が0から1の範囲内であることを確認する。
  2. マーカーサイズの指定が間違っている

    • エラー
      error: scatter3: S must be a scalar or the same size as X, Y, and Z
    • 原因
      マーカーサイズ s を指定する際、スカラー値でない場合、x, y, z と同じサイズである必要がある。
    • 解決策
      • すべてのデータ点に同じサイズを適用する場合は、スカラー値を指定する。
      • データ点ごとに異なるサイズを適用する場合は、x, y, z と同じサイズのベクトルを指定する。
  3. グラフが表示されない

    • 原因
      • グラフウィンドウが閉じられている。
      • グラフが他のウィンドウの背後に隠れている。
      • データが範囲外で表示されていない。
    • 解決策
      • figure コマンドを使って新しいグラフウィンドウを開く。
      • ウィンドウを最小化・最大化して、表示を更新する。
      • axisコマンドを使ってグラフの軸範囲を調整する。例えば、axis([xmin xmax ymin ymax zmin zmax])のように指定する。
      • viewコマンドで3次元グラフの視点を変更する。
  4. パフォーマンスの問題

    • 原因
      大量のデータをプロットすると、グラフの描画に時間がかかる。
    • 解決策
      • データを間引いてプロットする。
      • マーカーのサイズを小さくする。
      • ハードウェアアクセラレーションを有効にする。
      • gnuplotのterminalの種類を変更する。

一般的なトラブルシューティングのヒント

  • clear allコマンドで変数を全てクリアして、再度実行する。
  • help scatter3 コマンドを使って、関数の詳細な情報を確認する。
  • 簡単な例から始めて、徐々に複雑なプロットを作成する。
  • エラーメッセージをよく読み、原因を特定する。


例1: 基本的な3次元散布図

% 3次元のランダムなデータを作成
x = rand(1, 50);
y = rand(1, 50);
z = rand(1, 50);

% 散布図を描画
scatter3(x, y, z);

% 軸ラベルとタイトルを追加
xlabel('X軸');
ylabel('Y軸');
zlabel('Z軸');
title('基本的な3次元散布図');

%グリッドを追加
grid on;

この例では、50個のランダムな3次元データ点をプロットし、基本的な散布図を作成しています。xlabel, ylabel, zlabel で軸ラベルを設定し、title でグラフのタイトルを設定しています。grid onでグリッドを表示しています。

例2: マーカーのサイズと色を指定

% 3次元のランダムなデータを作成
x = rand(1, 50);
y = rand(1, 50);
z = rand(1, 50);

% マーカーのサイズと色を指定して散布図を描画
scatter3(x, y, z, 70, 'r', 'filled');

% 軸ラベルとタイトルを追加
xlabel('X軸');
ylabel('Y軸');
zlabel('Z軸');
title('マーカーのサイズと色を指定した3次元散布図');

%グリッドを追加
grid on;

この例では、scatter3(x, y, z, 70, 'r', 'filled') のように、マーカーのサイズを 70 に、色を赤 ('r') に、塗りつぶし ('filled') を指定しています。

例3: データ点ごとに異なる色とサイズを指定

% 3次元のランダムなデータを作成
x = rand(1, 50);
y = rand(1, 50);
z = rand(1, 50);

% データ点ごとに異なる色とサイズを生成
sizes = rand(1, 50) * 100; % サイズを0から100の範囲でランダムに生成
colors = rand(50, 3);      % RGB色をランダムに生成

% 散布図を描画
scatter3(x, y, z, sizes, colors, 'filled');

% 軸ラベルとタイトルを追加
xlabel('X軸');
ylabel('Y軸');
zlabel('Z軸');
title('データ点ごとに異なる色とサイズを指定した3次元散布図');

%グリッドを追加
grid on;

この例では、sizes ベクトルで各データ点のサイズをランダムに生成し、colors 行列で各データ点のRGB色をランダムに生成しています。これにより、データ点ごとに異なるサイズと色でプロットされます。

例4: マーカーの形状を指定

% 3次元のランダムなデータを作成
x = rand(1, 50);
y = rand(1, 50);
z = rand(1, 50);

% マーカーの形状を指定して散布図を描画
scatter3(x, y, z, 'x');

% 軸ラベルとタイトルを追加
xlabel('X軸');
ylabel('Y軸');
zlabel('Z軸');
title('マーカーの形状を指定した3次元散布図');

%グリッドを追加
grid on;

この例では、scatter3(x, y, z, 'x') のように、マーカーの形状をバツ記号 ('x') に指定しています。他の形状('o', '+', '*', '.' など)も試してみてください。

% 3次元のランダムなデータを作成
x = rand(1, 50);
y = rand(1, 50);
z = rand(1, 50);

% zの値に基づいて色を指定
scatter3(x, y, z, 50, z, 'filled');

% カラーバーを追加
colorbar;

% 軸ラベルとタイトルを追加
xlabel('X軸');
ylabel('Y軸');
zlabel('Z軸');
title('色マップを使用した3次元散布図');

%グリッドを追加
grid on;


plot3 関数を使用する

plot3関数は、3次元の線や点を描画するために使用されます。scatter3と同様に、3次元のデータをプロットできますが、デフォルトでは線で接続されます。点のみを表示するには、マーカーオプションを使用します。

% 3次元のランダムなデータを作成
x = rand(1, 50);
y = rand(1, 50);
z = rand(1, 50);

% plot3を使用して点のみをプロット
plot3(x, y, z, 'o'); % 'o' は円形のマーカーを指定

% 軸ラベルとタイトルを追加
xlabel('X軸');
ylabel('Y軸');
zlabel('Z軸');
title('plot3を使用した3次元散布図');

%グリッドを追加
grid on;
  • scatter3 のように、マーカーのサイズや色を直接指定するオプションは限られていますが、set 関数を使用してカスタマイズできます。
  • plot3(x, y, z, 'o') のように、'o' を指定すると円形のマーカーのみが表示されます。他のマーカー形状も指定できます('+', 'x', '*', '.' など)。

surf 関数を使用する(特定のケース)

データが規則的なグリッド上に配置されている場合、surf 関数を使用して3次元の表面としてプロットできます。これは散布図とは少し異なりますが、データの分布を視覚化するのに役立ちます。

% グリッド状のデータを作成
[X, Y] = meshgrid(-2:0.2:2, -2:0.2:2);
Z = X .* exp(-X.^2 - Y.^2);

% surfを使用して3次元表面をプロット
surf(X, Y, Z);

% 軸ラベルとタイトルを追加
xlabel('X軸');
ylabel('Y軸');
zlabel('Z軸');
title('surfを使用した3次元表面プロット');
  • データの規則的なパターンを視覚化するのに適しています。
  • surf 関数は、meshgrid で作成されたグリッドデータを使用します。

mesh 関数を使用する

mesh 関数は、surf 関数と同様に3次元の表面をプロットしますが、表面をワイヤーフレームとして表示します。

% グリッド状のデータを作成
[X, Y] = meshgrid(-2:0.2:2, -2:0.2:2);
Z = X .* exp(-X.^2 - Y.^2);

% meshを使用してワイヤーフレームの3次元表面をプロット
mesh(X, Y, Z);

% 軸ラベルとタイトルを追加
xlabel('X軸');
ylabel('Y軸');
zlabel('Z軸');
title('meshを使用した3次元ワイヤーフレームプロット');
  • mesh 関数は、データの形状を強調して表示するのに役立ちます。

pclviewer (Point Cloud Library Viewer) を利用する

Octaveの標準機能ではありませんが、Point Cloud Library (PCL) Viewer を利用することで、より高度な3次元点群データの可視化が可能です。

  • pclviewerは、非常に大きな点群データを効率的に表示し、様々な可視化機能を提供します。
  • pclviewerを利用するには、PCLとOctaveの連携設定が必要です。

opengl を利用する

OctaveのOpenGL機能を利用することで、より高度な3次元グラフィックス処理が可能です。

  • OpenGLは、より複雑な3次元オブジェクトの描画やインタラクティブな操作を可能にします。
  • OpenGLを使用するには、OctaveのOpenGLパッケージをインストールし、OpenGLの知識が必要です。