#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. Ваше предложение не подходит для моей проблемы, потому что я подготовил треугольную диаграмму для отображения трех наборов данных, и поэтому мне нужно больше, чем оси.