Seeking a fast way to determine if axes are current
이전 댓글 표시
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
What do you mean by "if axes are current"? What the code you posted does, unless I am mistaken, is finding out whether there are any axes in the current figure. I interpret your question as how to find out if some handle is equal to the current axes:
some_handle == gca
If you explicitly keep track of the objects you generate then the logical test might become unnecessary, or at least much faster.
Joseph Cheng
2014년 9월 29일
편집: Joseph Cheng
2014년 9월 29일
How about using:
AxesCurrent = ~isempty(get(gcf,'children'));
or if there are any other uicontrols available then you can additionally use
get(get(gcf,'children'),'type')
and then see if there are any of type axes. but that might be just as long if not longer than findobj.
Also what is your exact desire? here all this would check if they exist and not if they've been updated for each iteration
Chad Greene
2014년 9월 29일
José-Luis
2014년 9월 29일
Tricky...especially since gca will create axes if they don't exist.
Chad Greene
2014년 9월 29일
채택된 답변
추가 답변 (2개)
Alexander Laut
2017년 9월 14일
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
Cam Salzberger
2017년 9월 14일
편집: Cam Salzberger
2017년 9월 14일
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
Cam Salzberger
2017년 9월 14일
편집: Cam Salzberger
2017년 9월 14일
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
카테고리
도움말 센터 및 File Exchange에서 Creating, Deleting, and Querying Graphics Objects에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!