matlab: оператор `hold off` постоянно изменяет свойство FigureNextplot, если значение «добавить» не является значением по умолчанию

#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 , не работает для нее