Seeking a fast way to determine if axes are current
4 次查看(过去 30 天)
显示 更早的评论
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 个评论
采纳的回答
更多回答(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
0 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Graphics Object Programming 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!