6

点の近く(上ではない)のマーカーとして、円で囲まれた数字をグラフに配置したいと思います。簡単そうに聞こえますが、ズーム/アスペクト比の変化にも影響を受けないようにしたいと思います。

この不変量のため、円を線オブジェクトとして描画することはできません(再スケール時に再描画する必要があります)。円マーカーを使用する場合、再スケール時にオフセットを調整する必要があります。

私が考えることができる最も簡単なアプローチは、関数の文字列にUnicodeまたはWingdings文字①②③などを使用することtext()です。ただし、Unicodeは正しく機能していないようです。次のサンプルは、①でのみ機能し、他の数値(長方形のボックスを生成)では機能しません。

作品:

clf; text(0.5,0.5,char(129),'FontName','WingDings')

動作しません(丸で囲んだ2である必要があります):

clf; text(0.5,0.5,char(130),'FontName','WingDings')

何が得られ、誰かが回避策を提案できますか?

4

2 に答える 2

8

これは私にとってはうまくいくようで、Matlabのラテックスインタープリターを使用しています\textcircled

clf; text(0.5, 0.5, '$\textcircled{2}$', 'Interpreter', 'latex')

\textcircledコマンドにはいくつかのオフセットの問題があるようです。おそらく、使用されているラテックスコマンドを改善して、私たちに知らせてください:)

たとえば、上記のリンクをたどると、次のようにしてより良い結果が得られます。

clf; text(0.5, 0.5, '$\raisebox{.5pt}{\textcircled{\raisebox{-.9pt} {2}}}$', 'Interpreter', 'latex')

それでも、2桁の数字はひどいように見えます。

于 2012-05-30T14:43:12.470 に答える
7

マーカー(テキスト+円)がズーム/サイズ変更に対して不変である例を次に示します。

%# some graph in 2D
[adj,XY] = bucky;
N = 30;
adj = adj(1:N,1:N);
XY = XY(1:N,1:2);

%# plot edges
[xx yy] = gplot(adj, XY);
hFig = figure(); axis equal
line(xx, yy, 'LineStyle','-', 'Color','b', 'Marker','s', 'MarkerFaceColor','g')

%# draw text near vertices
xoff = 0; yoff = 0;     %# optional offsets
str = strtrim(cellstr(num2str((1:N)')));
hTxt = text(XY(:,1)+xoff, XY(:,2)+yoff, str, ...
    'FontSize',12, 'FontWeight','bold', ...
    'HorizontalAlign','right', 'VerticalAlign','bottom');

%# draw circles around text
e = cell2mat(get(hTxt, {'Extent'}));
p = e(:,1:2) + e(:,3:4)./2;
hLine = line('XData',p(:,1), 'YData',p(:,2), ...
    'LineStyle','none', 'Marker','o', 'MarkerSize',18, ...
    'MarkerFaceColor','none', 'MarkerEdgeColor','k');

%# link circles position to text (on zoom and figure resize)
callbackFcn = @(o,e) set(hLine, ...
    'XData',cellfun(@(x)x(1)+x(3)/2,get(hTxt,{'Extent'})), ...
    'YData',cellfun(@(x)x(2)+x(4)/2,get(hTxt,{'Extent'})) );
set(zoom(hFig), 'ActionPostCallback',callbackFcn)
set(hFig, 'ResizeFcn',callbackFcn)

スクリーンショット

@catchmeifyoutryが提案したLaTeXベースのソリューションと比較してください(2桁の数字に注意してください)。

%# use LaTeX to draw circled text at vertices
%#str = num2str((1:N)', '$\\textcircled{%d}$');
str = num2str((1:N)', '$\\raisebox{.5pt}{\\textcircled{\\raisebox{-.9pt} {%d}}}$');
text(XY(:,1), XY(:,2), str, ...
    'HorizontalAlign','right', 'VerticalAlign','bottom', ...
    'Interpreter','latex', 'FontSize',18)

スクリーンショット_latex

于 2012-05-31T16:35:29.460 に答える