Как отобразить несколько вызовов функций на одном рисунке

#matlab #function #plot #matlab-figure

#matlab #функция #график #matlab-рисунок

Вопрос:

Я создал matlab-функцию, которая отображает график. Когда я вызываю функцию несколько раз, я хочу, чтобы она отображала все графики на одном подготовленном рисунке. Но вместо этого мой код открывается при каждом вызове функции с подготовленным рисунком в новом окне, в котором есть только один График.

Моя функция выглядит следующим образом

 function myfunction(x,y)

if ~exist('myfigure')
    myfigure = openfig('myfigure.fig')
    assignin('base', 'myfigure',myfigure) 
end

figure(myfigure);
plot(x,y)

end
  

С помощью if-функции я попытался запретить ей открывать новое окно с фигурами, когда myfigure уже открыта. Но, похоже, Matlab просто игнорирует if-функцию, к моему удивлению. Даже назначение не помогло. Хотя проверка в окне командной строки показала, что exist(‘myfigure’) изменяет свое значение.
Я действительно не знаю, почему функция if игнорируется Matlab. Есть ли у вас какие-либо предложения, как это исправить

Ответ №1:

Проблема здесь в том, что exist не удается увидеть предыдущий рисунок, потому что его дескриптор удален при завершении предыдущего вызова функции. Мое предложение заключается в следующем:

Передайте дескриптор рисунка функции, а также верните его в качестве выходных данных:

 function myfigure = myfunction(x,y,myfigure)
if nargin<3 % if you pass 2 variables or less
    myfigure = figure; % create a figure
else
    figure(myfigure); % otherwise use the one in handle
end
plot(x,y)
end
  

Вот пример кода для этого:

 x = 0:0.01:2*pi;
myfigure = myfunction(x,sin(x)); %first call
myfunction(x,cos(x),myfigure); % second call
myfunction(x,tan(x),myfigure); % third call...
  

Обратите внимание, что вам нужно получить myfunction вывод только при первом вызове, затем вы можете продолжать использовать его, пока не удалите рисунок.

Комментарии:

1. Привет @EBH, при первом вызове функции «myfigure» не открыта и не определена. У меня это не сработало. Теперь я помог себе, опустив код рисунка в функции. Это должно вводиться каждый раз в дополнение к функции таким образом.

2. Спасибо за ваш ответ. Это в целом то, что я искал. Мой голос, который вы, возможно, не видите, потому что у меня меньше очков репутации. Одно замечание для других: после «plot» в функции мне пришлось добавить «hold on», и вы можете не использовать tan (x) для тестирования, потому что оно становится бесконечным при x = 0.

Ответ №2:

Функция figure , которую вы использовали, вероятно, является причиной того, что она открывает новый рисунок.

Что вы, возможно, захотите сделать, это просто получить текущие оси и построить график в нем.

Итак, ваша функция будет выглядеть следующим образом

 function myfunction(x,y)

myaxes = gca; 
plot(myaxes,x,y)

end
  

Это сработало бы, если у вас есть только одна активная фигура и оси, если у вас их больше, чем вы хотите передать дескриптор осей функции.

Комментарии:

1. Извините, я не ответил в сжатые сроки.

2. Ваше предложение не подходит для моей проблемы, потому что я подготовил треугольную диаграмму для отображения трех наборов данных, и поэтому мне нужно больше, чем оси.