2012-05-30 3 views
6

Я хочу нанести на диаграмме маркер рядом с (но не на) точкой. Звучит просто, но я также хочу быть инвариантом изменений масштаба/формата.matlab: наложение кругового номера на график

Из-за этого инварианта я не могу нарисовать круг как объект линии (без его перерисовки при перемасштабировании); если я использую маркер круга, мне придется корректировать его смещение при масштабировании.

Самый простой подход, который я могу придумать, - использовать символы Unicode или Wingdings & # x2460; & # X2461; & # X2462; и т. д. в строке для функции text(). Но unicode, похоже, не работает правильно, и следующий пример работает только с & # x2460; а не для других чисел (которые дают прямоугольные коробки):

работы:

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

не работает (должно быть в кружке 2):

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

Что дает и может кто-нибудь предлагает обходной путь?

ответ

8

Это, кажется, работает для меня, использует латекс переводчик Matlab, и \textcircled:

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

Команда \textcircled кажется есть некоторые offset problems, может быть, вы можете попытаться улучшить используемую команду латекса и дайте нам знать :)

После указанной выше ссылке, например, я получаю лучшие результаты с:

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

Тем не менее, две цифры цифры выглядят ужасно.

+0

милый !!!!!!! Это действительно помогает. Спасибо. Я знаю несколько основ в TeX, но не использовал их много в течение последних 10 лет; Я прекратил использовать его, как только понял, что слишком много моих клеток мозга знакомо с инструментом, который я часто не использую. :-( –

+0

рад, что это помогло :) – catchmeifyoutry

6

Ниже приведен пример, где маркеры (текст + кружки) инвариантны для увеличения/размер:

%# 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) 

screenshot

Сравнить против LaTeX на основе решения, предложенного @catchmeifyoutry (обратите внимание на номера два-цифры):

%# 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) 

screenshot_latex

+0

ooh, interesting! Я должен попробовать это, когда у меня появится шанс. –