How to set disableDefaultInteractivity for all axes?
Show older comments
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?
Accepted Answer
More Answers (3)
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
KAE
on 16 Sep 2019
Bruno Luong
on 16 Sep 2019
Edited: Bruno Luong
on 21 Sep 2020
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()
% DisableAxeToolbar()
% Overright MATLAB automatic creation of axtoolbar
% that appears above the top-right corner when a new axes is created
% You might invoke DisableAxeToolbar in sctatup.m
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
axtoolbar(ax, {}, 'Visible', 'off');
% fprintf('disable toolbar axe invoked\n');
catch
fprintf('disable toolbar fails\n');
end
end
Bruno Luong
on 17 Sep 2019
Edited: Bruno Luong
on 17 Sep 2019
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
m miozzi
on 22 May 2020
0 votes
Yes, Yair!!
In http://undocumentedmatlab.com/articles/improving-graphics-interactivity there is a suggestion about disabling unwanted interactivity behaviors while preserving zoom and pan (but you can choose what you like...):
hAxes.Interactions = [zoomInteraction regionZoomInteraction rulerPanInteraction];
hAxes.Toolbar = [];
The first attempts to apply the suggestion failed like described by Bruno, because of the reset of the default axes Interaction property at line 53 of clo.m (<MATLABROOT>\toolbox\matlab\graphics\private\clo.m).
By adding lines 54 and 55 in clo.m (see below) everything works like requested.
This is encouraging, but a serious analysis of the side effects was not done yet.
52 obj = handle(obj); % In case of double handle
53 obj.clo(hsave, (do_reset == 1)); % Call clo method on graphics class
54 obj.Interactions = [zoomInteraction regionZoomInteraction rulerPanInteraction];
55 obj.Toolbar = [];
Andrew Peters
on 27 Jan 2022
Edited: Andrew Peters
on 27 Jan 2022
disableDefaultInteractivity didn't work for me on R2021b, but putting this into startup did:
set(groot,'defaultAxesCreateFcn', @(ax,~) set(ax,'Interactions',[]));
Categories
Find more on Creating, Deleting, and Querying Graphics Objects in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!