2

関数daspect()を使用して、3 次元プロットの Y 軸と Z 軸が MATLAB で同等のスケール サイズで表示されるようにしました。

次のコードを使用してこれを達成しました(plot3で図をプロットした後に適用されます):

tmpAspect=daspect(); % get the aspect ratio of the axes scales
daspect(tmpAspect([1 2 2])); % make the Y and Z axes equal in scale

図を最初にプロットするときに Y 軸と Z 軸を同じにする必要があるため、これはまさに私が探している動作です。

ただし、ズームインしようとすると、Y 軸と Z 軸の間の厳密な関係を維持しながらズームすることしかできません。もちろん、これはまさに私がプログラムに依頼したことであり、非常にうまく機能しています。しかし、この Y 軸と Z 軸の関係は、プロットの生成時にのみ適用したいと考えています。その後、好きなようにズームインできるようにする必要があります。

(上記のコードのように)同等のスケールでプロットを設定する方法はありますが、ユーザーが必要に応じてこの関係を壊すことはできますか?

編集:下の画像は、私のフィギュアの3つのビューを示しています。まず、3 次元では、Y 軸と Z 軸 (どちらも度単位) の間の厳密な関係を維持すると便利であることがわかります。次に、これは X 軸と Y 軸のみのビューです。より詳細に見るには (3 番目の画像)、水平方向のみに拡大する必要があります。この時点で、視覚化を容易にするために、Y 軸と Z 軸の間の関係を削除すると便利です。

nb Y 軸には「X 位置」データが含まれ、Z 軸には「Y 位置」データが含まれます。物事をより混乱させるためだけに!

ここに画像の説明を入力

4

2 に答える 2

1

わかりました、これがあなたの問題への私の最初の刺し傷です。アプローチ:

  • 図形を作成し、前と同じように縦横比を固定します
  • XY または XZ 投影が必要な場合は、軸の下にあるボタンの 1 つを押すだけです。

ボタンを押すと、水平方向のズーム (x 方向のみ) がすぐに有効になるため、マウス ホイールをスクロールすると、軸が水平方向にズームされます。

飛び込む前に、すべてをコピーして m-file という名前のファイルに貼り付けてmyPlot.m実行します。これが実際にあなたが求めているものに沿ったものであるかどうかを確認してください. ご満足いただけましたら、さらにスパイスを加えます。

function myPlot

    % init figure
    fig = figure;
    set(fig, 'units', 'normalized');

    % some sample data
    datat = 0:200*pi;
    dataz = sin(datat) + rand(size(datat));
    datay = cos(datat) + rand(size(datat));
    datax = datat;

    % sample plot
    plt3D   

    % your current method    
    function plt3D(varargin)
        cleanFig         
        plot3(datax, datay, dataz, 'b.')        
        view(-68, 30)
        tmpAspect = daspect();
        daspect(tmpAspect([1 2 2]));
    end

    % 2D plot, XY projection
    function pltXY(varargin)
        cleanFig
        plot(datax, datay, 'b.')  
        xlabel('Time [msec]')
        ylabel('X-position');
        zoom xon
    end

    % 2D plot, XZ projection
    function pltXZ(varargin)
        cleanFig
        plot(datax, dataz, 'b.')
        xlabel('Time [msec]')
        ylabel('Y-position (^{\circ})');
        zoom xon        
    end

    % draw the buttons
    function pltButtons        

        uicontrol(...
            'parent'  , fig,...
            'style'   , 'pushbutton', ...
            'units'   , 'normalized',...
            'position', [0, 0, 1/3, 1/15], ...
            'string'  , 'plot 3D',...
            'callback', @plt3D);

        uicontrol(...
            'style'   , 'pushbutton', ...
            'units'   , 'normalized',...
            'position', [1/3, 0, 1/3, 1/15], ...
            'string'  , 'plot XY',...
            'callback', @pltXY);

        uicontrol(...
            'style'   , 'pushbutton', ...
            'units'   , 'normalized',...
            'position', [2/3, 0, 1/3, 1/15], ...
            'string'  , 'plot XZ',...
            'callback', @pltXZ);        
    end

    % re-init the figure
    function cleanFig
        set(0, 'currentfigure', fig)
        clf, hold on
        pltButtons
    end 

end
于 2012-08-13T14:31:54.880 に答える
0

簡単な方法があるのだろうか。ただし、すべてが失敗した場合は、独自のズームコールバックを作成できます。

doc zoomいくつかの例を参照してください。

于 2012-08-13T10:01:59.757 に答える