Asked by Chad Greene
on 29 Sep 2014

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?

Answer by José-Luis
on 29 Sep 2014

Edited by José-Luis
on 29 Sep 2014

Accepted Answer

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.

Chad Greene
on 29 Sep 2014

Nice! Takes about 1/3 of the time of my original findobj method. Thanks José-Luis.

José-Luis
on 29 Sep 2014

My pleasure.

Sign in to comment.

Answer by 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

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.

Answer by Cam Salzberger
on 14 Sep 2017

Edited by 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

Sign in to comment.

Opportunities for recent engineering grads.

Apply Today
## 5 Comments

## José-Luis (view profile)

## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/156708-seeking-a-fast-way-to-determine-if-axes-are-current#comment_239979

## Joseph Cheng (view profile)

## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/156708-seeking-a-fast-way-to-determine-if-axes-are-current#comment_239980

## Chad Greene (view profile)

## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/156708-seeking-a-fast-way-to-determine-if-axes-are-current#comment_239983

## José-Luis (view profile)

## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/156708-seeking-a-fast-way-to-determine-if-axes-are-current#comment_239984

## Chad Greene (view profile)

## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/156708-seeking-a-fast-way-to-determine-if-axes-are-current#comment_239986

Sign in to comment.