Четыре одинаковых участка с разным углом обзора - PullRequest
0 голосов
/ 23 ноября 2018

Я сделал следующий 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 голосов
/ 23 ноября 2018

Да, элегантным решением было бы создание функции из вашего кода, например:

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 различными углами обзора, так как это было главной темой вашего вопроса.

0 голосов
/ 23 ноября 2018

Вы можете использовать функцию 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)

Примечание : Если вы заранее знаете представление, которое вам нужно, вы можете также поместить значения в массив в начале и установить представление каждой оси непосредственно впетля, где вы регулируете их положение.

...