修复绘图的绘图比例(然后再次修复它们)

时间:2012-08-10 15:49:51

标签: matlab plot

我使用函数 daspect()使三维图的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轴的视图。为了更详细地查看(第3张图像),仅需要水平放大。此时,删除Y轴和Z轴之间的关系有助于更好地进行可视化。

n.b。 Y轴包含' X位置'数据和Z轴包含“Y”位置'数据。只是为了让事情更加混乱!

enter image description here

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我想知道是否有一个简单的方法。但如果一切都失败了,你可以创建自己的缩放回调。

有关示例,请参阅doc zoom