2016-07-13 19 views
1

scatterコマンドを使用してプロットされたいくつかのポイントにラベルを追加したいと思います。簡略化のために、のは、私は一点のみを持っているとしましょう:グラフにポイントを(縦に)ラベル付けする方法

x = 10; 
pointSize = 100; 
fontSize = 20; 

P = scatter(x, 0, pointSize, [0,0,0], 'filled'); 

text(x, 0, 'pointLabel',... 
    'HorizontalAlignment', 'center',... 
    'VerticalAlignment', 'bottom',... 
    'FontSize', fontSize); 

前のコマンドの問題点は、テキストpointLabelプロパティpointsizefontSizeに割り当てられた値に応じて、ポイントPと重なっていることです。

私はtextコマンドのドキュメントを読んだことがありますが、例では、ラベルを図の特定のポイントに水平に並べる方法を示しています。配置を水平にする必要がある場合は簡単ですが、ラベルpointLabely座標を他の次元の値から計算する一般的な方法は見つかりませんでした。

明らかに私はさまざまな値の組み合わせをテストすることで良いアライメントに到達できますが、私は一般的な解決策を探しています。

私を助けることができる人はいますか?

+0

'text'は** axes **ドメインの座標を受け入れます。つまり、一定のオフセット(たとえば「2」)を適用すると、場合によってはうまく見えるが、他の場合はひどく悪いことがあります。データの限界に基づいてオフセットを再スケーリングするか、または 'annotation'関数を考慮することができます。 'annotation'関数は** figure **座標を受け入れます。したがって、データの制限にかかわらず、例えば' 0.2'の一定のオフセット値が良く見える可能性が高くなります。 2番目のオプションでは、座標を変換する必要があります。 FEXの「単位を変換するデータ空間」を参照してください。 –

答えて

1

これは、> = R2014bを使用していることを前提にしていますが、setgetコマンドを使用して古いバージョンでも実行できます。

テキストオブジェクトが作成されるとき、そのデフォルト単位はデータ座標ですが、変更可能です。あなたの場合、私はポイントを持って行きます。

x = 10; 
pointSize = 100; 
fontSize = 20; 

P = scatter(x, 0, pointSize, [0,0,0], 'filled'); 

t = text(x, 0, 'pointLabel',... 
    'HorizontalAlignment', 'center',... 
    'VerticalAlignment', 'bottom',... 
    'FontSize', fontSize); 

% It's always a good idea to switch back to the default units, so remember them. 
originalUnits = t.Units; 
t.Units = 'points'; 

% Shift the text up by the sqrt(pi)/2 times the radius of the point 
t.Position(2) = t.Position(2) + sqrt(pointSize)/2; 
t.Units = originalUnits; 

詳細はText Propertiesを参照してください。非常に洗練されたものにしたい場合は、読み取り専用のプロパティExtentと既知のマーカーのサイズと位置を使用して、ラベルがポイントの1つに重なっているときを計算することができます。デフォルト単位はデータ空間にあるため、変換は必要ありません。

古いバージョンのMATLABを使用している場合は、これらのオプションとプロパティはすべて使用できますが、使用するにはちょっとした作業が必要です。たとえば、上記のように位置を設定することはできませんが、代わりにgetを使用して一時変数に割り当て、変更してからsetを使用して更新します。より多くのコード行が、最終的には同じ効果をもたらします。

+1

ありがとうございますが、 'sqrt(pointSize)/ 2'ではなく' fontsize/2'で 't'をなぜ上げるのか分かりません。これは良い結果を生み出すコードです: 'originalUnits = get(t、 'Units'); セット(t、 '単位'、 'ポイント'); tPos = get(t、 'Position');tPos(2)= tPos(2)+ sqrt(pointSize)/ 2; set(t、 'Position'、tPos); set(t、 'Units'、originalUnits); ' –

+0

' sqrt(pointSize) 'を例に挙げます。' fontSize'ではなく、厄介な 'pointSize'値です。とにかく、あなたの答えのおかげで、私は非常に一般的な解決策を得ることができました。 –

+1

例としてシフトするのに金額を使用しました。要点は、各テキストラベルの 'position'と' units'を照会して、あなたが好きな単位を好きなように動かすことでした。また、 'Extent'プロパティを使って左と右にシフトして他のポイントに衝突するのを防ぐこともできます。 – craigim

関連する問題