#matlab #matlab-figure
Вопрос:
Я установил свойству FigureNextplot по умолчанию значение «новый», в отличие от заводского значения по умолчанию «добавить».:
set(groot, 'DefaultFigureNextplot', 'new')
При использовании hold on
Matlab устанавливает свойства FigureNextplot и AxesNextplot в «добавить», как и должно быть. Однако, когда я затем закончу работу над графиком, hold off
сбросит свойство AxesNextplot, но не свойство FigureNextplot.
В чем причина этого? Есть ли способ продолжать использовать мои настройки по умолчанию, не удаляя мои коды из всех hold
операторов?
Комментарии:
1. Возможно, причина в том, что они предпочитали не предполагать многого и изменять эти свойства только в случае крайней необходимости. Чтобы изменить,
hold off
нужно было бы иметь какую-то историю предыдущих значений свойства, что значительно усложняет функцию, так как она внезапно перестает быть автономной функцией.2. Стоит отметить, что такое поведение, по крайней мере, задокументировано; см. в конце
hold
документации3. Зачем вам вообще использовать
hold off
, в отличие, скажем, от того,cla
чтобы начинать новый сюжет?hold off
предназначен для интерактивной работы. В скрипте или функции он всегда должен быть включен, так как намного проще управлять вещами, когда вы явно очищаете оси.4. @CrisLuengo Я согласен с вами, но
cla
не меняет свойств фигуры. Проблема действительно в томhold on
.
Ответ №1:
Вы можете использовать обходной NextPlot
путь, чтобы предотвратить изменение свойства фигуры:
- Перехватите вызов
hold
, сохранив следующую пользовательскую функцию в файле с именемhold.m
, поместив этот файл в пользовательскую папку и добавив эту папку в путь сaddpath
помощью . - Эта определяемая пользователем функция принимает к сведению свойство фигуры
NextPlot
, вызывает исходнуюhold
функцию, а затем восстанавливает свойство фигурыNextPlot
.
function hold(varargin)
fnp = get(gcf, 'NextPlot'); % get figure's NextPlot property
w = which('hold' ,'-all'); % paths to the modified and original hold functions
dir = pwd; % take note of current folder
cd(fileparts(w{2})); % change to folder of original hold function
oh = @hold; % get a handle to that function
cd(dir) % restore folder
feval(oh, varargin{:}) % call original hold function
set(gcf, 'NextPlot', fnp); % set figure's NextPlot property to its previous value
Обратите внимание , что если вы вызываете hold
без аргументов для переключения состояния удержания между on
и off
, on
состояние распознается как свойства фигуры и оси NextPlot
, имеющие значения add
. Это можно увидеть в коде исходной hold
функции:
nexta = get(ax,'NextPlot'); nextf = get(fig,'NextPlot'); hold_state = strcmp(nexta,'add') amp;amp; strcmp(nextf,'add');
Поэтому, если свойство фигуры NextPlot
имеет значение New
, hold
состояние всегда считается таковым off
, независимо от значения свойства оси. NextPlot
Таким образом, призыв к hold
без аргументов всегда приводит к тому, что сюжет удерживается.
Комментарии:
1. 1 за то, что выяснил это. Но мне не нравится идея затенения стандартной функции. Это неизбежно вызовет путаницу в какой-то момент.
2. @Cris Согласился. Если у вас есть лучшее предложение…
3. Можете ли вы не использовать
builtin()
для вызова встроенную версиюhold
после перехвата, чтобы избежать жонглирования путями?4. @Wolfie я пытался, но
builtin
в данном случае это не работает. Он работает для действительно встроенных функций, и, если я правильно помню, также для некоторых не встроенных. Ноhold
не является встроенной функцией (она реализована в виде m-файла) и, к сожалениюbuiltin
, не работает для нее