我绘制了以下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次并仅更改视角,还有一些优雅的方法吗?
我试图获取的输出示例:
答案 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个子图,因为这是您提出问题的重点。