具有不同视角的四个相同的子图

时间:2018-11-23 15:00:13

标签: matlab plot matlab-figure

我绘制了以下3D图:

figure
subplot(2,1,1)
hold on
plot3(X_LE, Y_LE,Z, 'red', 'linewidth', 2)
plot3(X_TE, Y_LE,Z, 'red', 'linewidth', 2)
plot3(X_LE, -Y_LE,Z, 'red', 'linewidth', 2)
plot3(X_TE, -Y_LE,Z, 'red', 'linewidth', 2)
plot3([X_LE(end) X_TE(end)],[Y_LE(end) Y_LE(end)],[0 0], 'red', 'linewidth', 2)
plot3([X_LE(end) X_TE(end)],[-Y_LE(end) -Y_LE(end)],[0 0], 'red', 'linewidth', 2)
grid on
axis equal
xlabel('x/b','Interpreter','latex')
ylabel('y/b','Interpreter','latex')
view(-45, 23);

但是,我想创建一个2x2子图,其中在4个子图中的每一个中,视角都是不同的。

不是将整个代码复制4次并仅更改视角,还有一些优雅的方法吗?

我试图获取的输出示例:

Figure window with 4 subplots, each showing the same data but from different point of view

2 个答案:

答案 0 :(得分:2)

您可以使用copyobj函数。

copyobj将允许您复制任何已定义的图形对象。因此,原理是创建第一个子图,然后将其简单复制3次并调整每个新副本的位置和视图。

要使用此功能(以及许多其他原因),最好保存创建的图形对象的句柄。这通常是通过将图形指令的返回值分配给变量来完成的。例如:

hp = plot(x,y) ;

plot对象的句柄保留在变量hp中,因此您始终可以使用此句柄来修改线属性。

对于您的特定情况,它会像这样:

%% Quick mock up of a 3D triangle (you did not give any sample data)
x = [0 ;  2 ; 1 ; 0 ] ;
y = [3 ;  1 ; 5 ; 3 ] ;
z = [2 ; -1 ; 4 ; 2 ] ;

%% use dummy subplots, just to save their position on a figure
hf = figure ;
for k=1:4
    hs = subplot(2,2,k) ;
    axpos{k,1} = hs.OuterPosition ;
end
clf(hf) ; % clear all subplots, keep only "axpos" and the empty figure

%% Generate the first subplot
%% (use your own code for that, but don't forget to retrieve the handles of the figure and the axes)
figure(hf) ;
% hs(1) = subplot(2,2,1) ; % use the line below instead. It is equivalent
                           % and it also set the 'hold on' mode for the axe
hs(1) = axes('parent',hf, 'OuterPosition',axpos{1},'NextPlot','add') ;
hp = plot3(x,y,z,'red', 'linewidth', 2) ;
grid on
axis equal
xlabel('x/b','Interpreter','latex')
ylabel('y/b','Interpreter','latex')
view(-45, 23);

%% Now use "copyobj" to copy the full axes object with the content and labels
for k=2:4
    hs(k) = copyobj( hs(1) , hf ) ;          % create a copy of the full subplot
    set( hs(k) , 'OuterPosition',axpos{k} )  % reposition it so it doesn't overlap the original
end

然后,您要做的就是根据需要更改每个子图的视图。 这可以通过将子图句柄用作view指令的第一个参数来完成。例如:

%% adjust the view of each subplot
view( hs(2) ,  25,40)
view( hs(3) , -25,32)
view( hs(4) ,  37,92)

注意:如果您事先知道要使用的视图,则还可以将这些值放在数组的开头,然后直接在调整其位置的循环中设置每个轴视图。 / p>

答案 1 :(得分:0)

是的,一种优雅的解决方案是从您的代码中创建一个函数,就像这样。

function [y] = changeViewAngle(pos, azimuth, elevation)
X_LE = -1:0.01:1;
X_TE = -1:0.01:1;
Y_LE = -1:0.01:1;
Z = -1:0.01:1;
subplot(2,2,pos)
hold on
plot3(X_LE, Y_LE,Z, 'red', 'linewidth', 2)
plot3(X_TE, Y_LE,Z, 'red', 'linewidth', 2)
plot3(X_LE, -Y_LE,Z, 'red', 'linewidth', 2)
plot3(X_TE, -Y_LE,Z, 'red', 'linewidth', 2)
plot3([X_LE(end) X_TE(end)],[Y_LE(end) Y_LE(end)],[0 0], 'red', 'linewidth', 2)
plot3([X_LE(end) X_TE(end)],[-Y_LE(end) -Y_LE(end)],[0 0], 'red', 'linewidth', 2)
grid on
axis equal
xlabel('x/b','Interpreter','latex')
ylabel('y/b','Interpreter','latex')
view(azimuth, elevation)
end

,然后将其另存为具有相同名称的文件,即 changeViewAngle.m

现在创建另一个脚本 main.m ,如下所示,

figure(2);
clear;
clc;
clf;

changeViewAngle(1, -45, 23)
changeViewAngle(2, 45, -23)
changeViewAngle(3, 25, 90)
changeViewAngle(4, 35, 75)

注意:请记住将目录更改为保存两个文件的目录。如果将它们都保存在同一文件夹中,将会很方便。否则,MATLAB可能会抱怨找不到该函数。

当然,您还必须根据要绘制的图来更改Z,X_LE,X_TE和Y_LE的值。我没有这些值,因此在此函数中使用了一些虚拟值。但是我想您知道如何绘制具有4个不同视角的4个子图,因为这是您提出问题的重点。