MATLAB Answers

KAE
0

How to set disableDef​aultIntera​ctivity for all axes?

Asked by KAE
on 9 Apr 2019
Latest activity Commented on by KAE
on 17 Sep 2019 at 11:30
In Matlab 2018b and later, the cursor is set to automatically interact with the plot. This messes up my plots (accidentally moving axes or adding unwanted data tips), so I would like to turn it off. You can do this for a specific axis ax with disableDefaultInteractivity(ax). However I would like to apply this to all axes I ever make. I know you can set preferences for some axis properties as follows,
set(0,'DefaultAxesColor', 'none');
But the following attemps did not work,
disableDefaultInteractivity(0) % Error: Input must be an axes handle
set(0, 'DefaultInteractivity', 'off') % Error: Too many output arguments
Is there another way to disable the axis interactivity for all axes?

  0 Comments

Sign in to comment.

2 Answers

Answer by Dhanashree Mohite on 12 Apr 2019
 Accepted Answer

In order to disable default interactivity for all created axes, you can use the following command:
>> set(groot,'defaultAxesCreateFcn','disableDefaultInteractivity(gca)')
But this setting will be reset when MATLAB is restarted.

  1 Comment

I put it in my startup file, so I can always have this set. Thanks so much - I would never have worked out this groot formatting. Since I also run older versions of Matlab, which don't have this setting, I had to implement it in my startup.m as follows,
a = version; % Get the version of Matlab that is running
if ~isempty(findstr(a, '2019')) % Only apply to R2019
set(groot,'defaultAxesCreateFcn','disableDefaultInteractivity(gca)'); % Disable interactivity of cursor in axes
end

Sign in to comment.


Answer by Bruno Luong
on 14 Sep 2019

For R2019b all the tricks found previously no longer work.
I found this one does the trick
set(groot,'defaultAxesCreateFcn', ...
@(ax,varargin) start(timer('StartDelay',1,'ExecutionMode','singleShot','TimerFcn',@(varargin) axtoolbar(ax,{}))));
You might put it in startup.m file
if ~verLessThan('MATLAB','9.7')
set(groot,'defaultAxesCreateFcn', ...
@(ax,varargin) start(timer('StartDelay',1,'ExecutionMode','singleShot','TimerFcn',@(varargin) axtoolbar(ax,{}))));
end

  4 Comments

Show 1 older comment
I have a more robust and cleaner version, that does not create plenty of timer objects
You can call
DisableAxeToolbar() in the startup.m (need to be on the default path) or independently.
function DisableAxeToolbar()
%
try %#ok
if ~verLessThan('matlab','9.5')
set(groot,'defaultFigureCreateFcn',@(fig,dummy)addToolbarExplorationButtons(fig));
if verLessThan('MATLAB','9.7')
set(groot,'defaultAxesCreateFcn',@(ax,dummy)set(ax.Toolbar,'Visible','off'));
else
set(groot,'defaultAxesCreateFcn', @(ax,varargin) TriggerAxeToolbarRemovalTimer([], ax));
end
fprintf('Restore global figure Toolbar\n');
end
end
end
%%
function TriggerAxeToolbarRemovalTimer(th, varargin) % R2019 or later
persistent T
if isempty(th)
if isempty(T)
T = CreateAxeToolbarRemovalTimer();
end
th = T;
end
if nargin >= 2
ax = varargin{1};
try
set(th,'UserData',ax);
start(th);
catch
% if we get here many axes are being created, we stack the timer
newth = CreateAxeToolbarRemovalTimer('StopFcn', @(obj, varargin) delete(obj));
TriggerAxeToolbarRemovalTimer(newth, varargin{:});
end
end
end % TriggerAxeToolbarRemovalTimer
function T = CreateAxeToolbarRemovalTimer(varargin)
T = timer('Name','AxeToolbarRemovalTimer',...
'BusyMode', 'queue', ...
'StartDelay',1,...
'ExecutionMode','singleShot',...
'TimerFcn',@(obj, event, varargin) Disableaxtoolbar(get(obj,'UserData')),... % get(obj,'UserData') returns axe handle
varargin{:});
end
function Disableaxtoolbar(ax)
try %#ok
axtoolbar(ax,{});
% fprintf('disable toolbar axe invoked\n')
end
end
Limitation: when new-plot replaces the oldone, the toolbar comeback !
close all
plot(rand(1,10)); % toolbar removed
hold on
plot(rand(1,10)); % toolbar still dsappears
hold off
plot(rand(1,10)); % toolbar comes back
% But when I call this it disappears again !!!!
axtoolbar(gca)
I don't quite understand how the toolbar works.
Right now I don't know how to work around this.
KAE
on 17 Sep 2019 at 11:30
Well I certainly appreciate that you shared what you tried! Sounds like a Yair Altman level question.

Sign in to comment.