存储MATLAB 3d视口

时间:2011-02-23 11:22:53

标签: matlab plot

我正在使用MATLAB显示3d数据。我使用GUI来改变视角,缩放和平移。如何存储此视图,然后将其应用于另一个图形(包含或多或少相同的数据)? view给了我一个矩阵,但我怎么能将它应用到另一个数字?

非常感谢!

3 个答案:

答案 0 :(得分:5)

要在另一个图上使用当前视角,您可以执行以下操作:

% call when the source axes is the current axes
[az, el] = view; 
% call when the target axes is the current axes
view (az, el);

或者,您可以使用get属性的setview执行相同操作。

但是,要应用您一起提到的所有视图属性,使用Matlab内置的“生成m文件”选项会更容易 - 当您想要3D图形时,请转到file - > Generate m-file,将创建一个m-file,将3D数据作为输入,然后应用设置。

另一种选择是自己保存这些相关设置(只需检查生成的m文件):

plot3(sin(t),cos(t),t);
pba = get(gca, 'PlotBoxAspectRatio');
dar = get(gca, 'DataAspectRatio');
cva = get(gca, 'CameraViewAngle');
cuv = get(gca, 'CameraUpVector');
ct = get(gca, 'CameraTarget');
cp = get(gca, 'CameraPosition');

然后将其应用于当前轴(假设目标轴是当前轴):

set(gca, 'PlotBoxAspectRatio',pba);
set(gca, 'DataAspectRatio',dar);
set(gca, 'CameraViewAngle',cva);
set(gca, 'CameraUpVector',cuv);
set(gca, 'CameraTarget',ct);
set(gca, 'CameraPosition',cp);

答案 1 :(得分:2)

要存储和应用视图,请参阅Itamar's answer

对于缩放和平移,您只需存储轴限制。使用xlim,ylim和zlim或相应的轴属性(XLim等)和get / set。

当前轴存储限制:

xl = xlim;
yl = ylim;
zl = zlim;

或者使用轴属性:

xl = get(gca,'XLim');

要应用于另一个图上的轴:

xlim(new_axes_handle,xl) % you can skip new_axes_handle for current axes
ylim(new_axes_handle,yl)
zlim(new_axes_handle,zl)

或者

set(new_axes_handle,'XLim',xl,'YLim',yl','ZLim',zl)

顺便说一下,除了Itamar的答案,你可以将所有轴属性一次性地放入一个结构中:

ax_properties = get(gca);

删除不想应用于新轴的字段,然后使用SET:

set(new_axes_handle,ax_properties)

要小心,因为结构也包含UserData。首先删除此字段。您可以通过以下代码执行此操作:

rmfield(ax_properties,'UserData')

答案 2 :(得分:1)

OMG,手动调整和生成M-File选项是我的英雄。如果我从一开始就知道我所要做的就是:

axes1 = axes('Parent',Plot_ele,'PlotBoxAspectRatio',[1 1.70454545454545 1.7],...
    'DataAspectRatio',[1 1 1],...
    'CameraViewAngle',7.48227189414101,...
    'CameraUpVector',[-0.0256575066196788 0.989185543639328 -0.144407938178721],...
    'CameraTarget',[255.013054349713 397.874703616223 449.003273637903],...
    'CameraPosition',[1445.8877301745 1407.25270740567 7151.59363497921]);
    % xlim(axes1,[0 528]); % uncomment to preserve axes x-limits
    % zlim(axes1,[0 897.6]); % uncomment to preserve axes z-limits
hold(axes1,'all');