2017-02-13 39 views
4

次のコードは、私が見つけることができる最もMinimal, Complete, and Verifiable exampleです。私の本当の場合は、はるかに複雑である:これは、その結果Matlabの凡例のタイトルを設定する

x = 1:0.1:10; 
y = sin(x); 

subplot 211 
plot(x,y) 
[leg,att] = legend('show'); 
title(leg,'my title') 
leg.Title.Visible = 'on'; 

subplot 212 
plot(x,y) 
leg = legend('show'); 
title(leg,'my title') 

:あなたがはっきりと見ることができたよう

legend title

、何かが上部の凡例のタイトルが間違っています。何とか、凡例の出力がattであることを尋ねると、そのタイトルに干渉します。まず何らかの理由で見えなくなりますが、それはすでに上のコードで解決されています。

主な問題は、その位置にあります。このようなプロパティはないようですので、一度設定すると移動できません。

私はtextのように、似たようなハックを考えることができますが、私の状況は非常に複雑で、すでに多くの凡例を構成しており、数字。したがって、私は、凡例タイトルの元の機能に依存する単純で実用的なソリューションを好む。

私はMatlab 2016aを使用します。

+0

あなたは= '[LGD、アイコン、プロット、TXT]のための[ドキュメント](https://mathworks.com/help/matlab/ref/legend.html)にこのノートを読みました伝説(___) 'オーバーロード? *注:この構文はお勧めしません。すべてのグラフィック機能をサポートしていない凡例が作成されます。代わりに* lgd = legend(__) '*構文を使用して凡例オブジェクトを返し、凡例のプロパティを設定します* – codeaviator

+0

@Cebriしかし、私の必要に応じて凡例を操作するために、アイコンへのアクセスが必要です。そうでなければ、私はどのようにプロパティを変更できますか? – EBH

+0

あなたが書いたように、あなたの最善の策は凡例の位置にテキストを使用することです。複数回実行する必要がある場合は、関数を作成することができます。 – oro777

答えて

1

注意!この回答はの文書化されていない機能を使用しています。その結果は、バージョン2016aおよび2017aでテストされ、他のバージョンでは異なる場合があります。
Matlabの他のバージョンでも動作するかどうかをコメントで教えてください。


凡例のundocumented propertiesを調査したところ、その回答が見つかりました。問題の最も直接的な答えは、凡例のタイトルの位置をその場所に戻すことです。これは、Positionという属性(の一部)であるのプロパティNodeChildrenの凡例タイトルで実行できます。

凡例ボックスは実質的に小さな軸オブジェクトであるため、位置単位は軸ボックスに対して正規化されます。私たちは伝説の作成後、それを見れば、我々が得る:我々は問題の伝説を参照してくださいどこ

[hleg,att] = legend('show'); 
title(hleg,'my title') 
hleg.Title.NodeChildren.Position 

ans = 
    0  0  0 

です。私は、縦軸(Y = 1.5)、及び奥行き軸上に、横軸(X = 0.5)の中心でそれを配置ここ

hleg.Title.NodeChildren.Position = [0.5 1.5 0]; 

:今はバックその正しい場所に移動することができそれがゼロ(Z = 0)ですので無関係です:あなたは伝説がデータを妨害することを選択肢に悩まされていない場合は

correct place

、(例えば、あなたの凡例は、データ軸の外側にある)、その後のことができます。ここで止​​まって。そうでない場合は、読み続ける...

hleg.Title.NodeChildren.BackgroundColor = 'w'; 

をしかし、背景が唯一のテキストボックスのためのものであり、凡例ボックスに整列されていないので、それが良い見ていない:


我々は白に背景色を設定することができます。だから私はタイトルを含むように凡例のボックスを拡大し、いくつかのスペースを作るために凡例の属性を下に移動することを好む。 (私たちはすべての要素の右の位置を計算する必要があるため)それはより多くの手間がかかるが、それは次の方法で行うことができます。

x = 1:0.1:10; 
plot(x,sin(x),x,cos(x)) 
[hleg,icons,plots] = legend('show'); 
title(hleg,'my title') 
hleg.Title.Visible = 'on'; 
% the addition in height needed for the title: 
title_hight = hleg.Position(4)/numel(plots); 
hleg.Position([2 4]) = [hleg.Position(2)-title_hight hleg.Position(4)+title_hight]; 
% calculate new position for the elements in the legeng: 
new_pos = fliplr(0.5/(numel(plots)+1):1/(numel(plots)+1):1); 
hleg.Title.NodeChildren.Position = [0.5 new_pos(1) 0]; 
% set the text to the right position: 
leg_txt = findobj(icons,'Type','Text'); 
txt_pos = cell2mat({leg_txt.Position}.'); 
txt_pos(:,2) = new_pos(2:end); 
set(leg_txt,{'Position'},mat2cell(txt_pos,[1 1],3)); 
% set the icons to the right position: 
leg_att = findobj(icons,'Type','Line'); 
set(leg_att,{'YData'},mat2cell(repmat(repelem(new_pos(2:end).',... 
    numel(plots)),1,2),ones(numel(plots)*2,1),2)) 

Iが、上記のコードは、より多くのデータ系列のためにも一般化されましたこれが正しい解決策を提供できず、いくつかの微調整が必​​要な場合があると推測します。

large box

関連する問題