MATLAB Answers

Seeking a fast way to determine if axes are current

10 views (last 30 days)
Chad Greene
Chad Greene on 29 Sep 2014
Edited: Cam Salzberger on 14 Sep 2017
I've written a function that includes a line to determine if axes are current. This is the line:
AxesAreCurrent = ~isempty(findobj(gcf,'type','axes'));
From the profiler I see that about three quarters of the processing time of my 400 line function is taken up by this line. It's only a fraction of a second, but I will be calling this function thousands of times in a row, and I'd like to speed it up. Is there a faster check to determine if any axes are current?
  5 Comments

Sign in to comment.

Accepted Answer

José-Luis
José-Luis on 29 Sep 2014
Edited: José-Luis on 29 Sep 2014
isempty(get(gcf,'CurrentAxes'))
will tell you if there are any current axes in gcf . This is basically an edit of the gca() function that does not create new axes if none exist.

More Answers (2)

Alexander Laut
Alexander Laut on 14 Sep 2017
i don't know how this compares but i found this solution useful for my needs to check if an axis exists without creating a figure so i can reset the color order
%%ResSet Color Order
if ~isempty(findobj(allchild(0),'Type','axes'))
set(gca(),'ColorOrderIndex',1) % resets color order if an axis exists
end
  1 Comment
Cam Salzberger
Cam Salzberger on 14 Sep 2017
There are a couple of issues with this piece of code. I assume you're trying to find even figures with hidden figure handles, which is why you used allchild. However, if the axes also has a hidden figure handle, then findobj won't find it, though findall would. If the axes handle is visible, but the figure handle is not, then gca will create a new figure and axes. For example:
f = figure('HandleVisibility','off');
a = axes('HandleVisibility','on','Parent',f);
if ~isempty(findobj(allchild(groot),'Type','axes'))
set(gca,'ColorOrderIndex',1)
end
If you want to deal with hidden handles, I'd suggest something more akin to this:
hAxes = findall(groot,'Type','axes')
if ~isempty(hAxes)
set(hAxes(1),'ColorOrderIndex',1)
% Or even set(hAxes, ...) to change all properties of all axes
end
It's not as clean, since there's no guarantee that hAxes(1) is the most recently clicked axes. However, a hidden handle figure/axes will never be in the 'CurrentFigure' or 'CurrentAxes' property, so that is kind of moot. I'll post something that can handle this in a separate answer.
-Cam

Sign in to comment.


Cam Salzberger
Cam Salzberger on 14 Sep 2017
Edited: Cam Salzberger on 14 Sep 2017
As Alexander pointed out, it may be desirable to avoid creating a figure with gcf. However, gca will have the same issues, if there are hidden handles. Here's something that can handle all hidden handle situations:
I'd suggest first checking for visible figures and axes without creating them, before then checking for hidden ones:
hFig = get(groot,'CurrentFigure');
if ~isempty(hFig)
hAx = get(hFig,'CurrentAxes');
if isempty(hAx)
hAxes = findall(hFig,'Type','axes');
hAx = hAxes(1);
end
else
hFigures = findall(groot,'Type','figure');
hAx = gobjects(0,0);
if ~isempty(hFigures)
k = 1;
while k < numel(hFigures) && isempty(hAx)
hAxes = findall(hFigures(k),'Type','axes');
if ~isempty(hAxes)
hAx = hAxes(1);
end
k = k+1;
end
end
end
You know, just to be really thorough. Now hFig and hAx will be a figure or axes handle respectively, or empty if there isn't one.
Qualifier: This is largely untested code, but hopefully can give you a guideline to work from.
-Cam

Tags

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!