2012-01-30 12 views
6

次のstackoverflow qestion:Matlabの凡例を軸からどのように伝えるには?

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

は、MATLABの図から、軸のすべてにハンドルを取得する方法を示します。しかし、このリストには少なくともR2008aの凡例へのハンドルも含まれており、これも軸であるように見えます。実際のプロット軸からの凡例を軸ハンドルのベクトルに(プログラムで)どのように伝えることができますか?

+1

また、 'colorbar'軸にも注意する必要があることに注意してください。 – Nzbuu

答えて

12

、あなたが欲しいのコードは次のとおりです。

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

これは、すべてのハンドルを返します。現在の図のデータ軸。

+0

しかし、悪意のある人が軸のタグを変更したらどうなりますか? –

+1

@Andrey:それでは、コードが失敗するのは当然です。 – Jonas

+0

'-not'オプションは+1です。私はこれを知らなかった。 – Jonas

6

1)デフォルトでは、凡例のTagプロパティは「凡例」です。もちろん、変更されないという約束はありません。

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)より堅牢であるもう1つの違いは()通常の軸がString性質を持っていないということですが、伝説を行います。 Stringプロパティを持つ他の種類のオブジェクトがあるかどうかはわかりません。たとえば:

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

あなたは呼び出すことによって、それを確認することができます。

のget(GCA、 '文字列')
を??? ==>を使用したエラー
'axes'クラスに 'String'プロパティはありません。

しかし、その一方で、そこに伝説ためこのような性質です。それがより堅牢な理由です。私はより広い文脈でこれを解決するために推薦する

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

ANS = '' 'B' 'C'

3)。ハンドルを保存して作成した凡例と軸を追跡するだけです。このような

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

コード:代わりのようなコーディングで、ある linkaxesから

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

あなたの答えは素晴らしいですが、私はNzbuuが私が探していた答えに近いと思います。 – crobar

+0

@crobar、thats ok、私は理解しています。確かに、Nzbuuの解決策にはいくらか優雅さがあります:) –

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); 

残念ながら、この解決策は、実装の詳細に依存します。

関連する問題