2012-01-30 90 views
6

以下計算器qestion:如何從Matlab中的座標軸中識別傳說?

Matlab: How to obtain all the axes handles in a figure handle?

標識如何從在Matlab中的人物獲得句柄所有軸。但是,這個列表還將包含圖例句柄,至少在R2008a中,它們看起來也是座標軸。我怎樣才能以(編程)的方式告訴來自真實座標軸的圖例在一個座標軸手柄中?

+1

請注意,您還需要注意'colorbar'軸。 – Nzbuu 2012-01-31 15:51:12

回答

12

linkaxes,你想要的代碼是:

ax = findobj(gcf,'type','axes','-not','Tag','legend','-not','Tag','Colorbar'); 

這將返回所有的手柄當前圖中的數據軸。

+0

但是如果有人惡意更改了軸的標籤會怎麼樣? – 2012-01-31 00:12:48

+1

@Andrey:那麼他們應該得到代碼失敗。 – Jonas 2012-01-31 04:30:12

+0

對於'-not'選項爲+1。我沒有意識到這一點。 – Jonas 2012-01-31 04:30:59

6

1)默認情況下,圖例的Tag屬性爲'Legend'。當然,沒有承諾它沒有改變。

get(l) 

.... 
BusyAction: 'queue' 
     HandleVisibility: 'on' 
       HitTest: 'on' 
     Interruptible: 'off' 
       Selected: 'off' 
    SelectionHighlight: 'on' 
        **Tag: 'legend'** 
        Type: 'axes' 
     UIContextMenu: 200.0018 
       UserData: [1x1 struct] 

.... 

2)的另一個差別(這是更健壯)是常規的軸不必String屬性,但圖例做。我不確定是否還有其他類型的對象也具有String屬性。例如:

plot(magic(3));legend('a','v','b'); 
    allAxesInFigure = findall(f,'type','axes') 
    b = isprop(allAxesInFigure,'String') 

你可以通過調用驗證:

GET(GCA, '字符串')
???錯誤使用==> get
'axes'類中沒有'String'屬性。

但在另一方面,傳說有這樣的屬性。這就是爲什麼它更健壯。

plot(magic(3)); l = legend('a','b','c'); 
get(l,'String') 

ANS = 'A' 'B' 'C'

3)我建議在更廣的範圍內來解決這一點。只需通過存儲手柄來跟蹤您創建的圖例和座標軸。 也就是說,而非編碼,如:

plot(magic(3)); 
legend('a','v','b'); 
plot(magic(5)); 
legend('a','v','b','c','d'); 

這樣的代碼:

p(1) = plot(magic(3)); 
l(1) = legend('a','v','b'); 
p(2) = plot(magic(5)); 
l(2) = legend('a','v','b','c','d'); 
+0

謝謝Andrey,你的回答非常好,但我認爲Nzbuu更接近我正在尋找的答案。 – crobar 2012-01-31 09:33:21

+0

@crobar,多數民衆贊成,我明白。事實上Nzbuu的解決方案中有一些優雅:) – 2012-01-31 15:06:30

0

只要稍微修改的my answer at the stackoverflow question you mentioned代碼:

axesHandles = get(fig, 'Children'); 
classHandles = handle(axesHandles); 
count = length(axesHandles); 
isLegend = false(1, count); 
for i = 1:count 
    isLegend(i) = strcmp(class(classHandles(i)), 'scribe.legend') == 1; 
end 
legendHandles = axesHandles(isLegend); 

不幸的是,這個解決方案取決於實施細節。