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 轴之间的这种关系 - 之后,它需要能够以我喜欢的任何方式进行缩放。

有没有一种方法可以设置具有等效比例的绘图(如上面的代码中所示),但如果他们愿意,允许用户打破这种关系?

编辑:下图显示了我的身材的三个视图。首先,在三个维度上,可以看出保持 Y 轴和 Z 轴(都以度为单位)之间的严格关系很有用。其次,这只是 X 和 Y 轴的视图。为了更详细地查看(第三张图片),只需要水平放大。此时,删除 Y 轴和 Z 轴之间的关系有助于更好地可视化。

nb Y 轴包含“X 位置”数据,Z 轴包含“Y 位置”数据。只是为了让事情变得更加混乱!

在此处输入图像描述

4

2 回答 2

1

好的,这是我第一次尝试解决您的问题。方法:

  • 制作一个图形,并像以前一样冻结纵横比
  • 如果您需要 XY 或 XZ 投影,只需按下轴下方的按钮之一

当您按下按钮时,水平缩放(例如,仅在 x 方向)将立即启用,因此滚动鼠标滚轮将水平缩放轴。

在深入研究之前,只需将所有内容复制并粘贴到一个名为myPlot.m并执行它的 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 回答