Вопрос по matlab, annotations, graphing – Matlab: положить обведенное число на график

6

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

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

Самый простой подход, который я могу придумать, - это использовать символы 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')

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

Ваш Ответ

2   ответа
8

это работает для меня, использует латексный интерпретатор Matlab и\textcircled:

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

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

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

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

Тем не менее, двузначные числа выглядят ужасно.

, 'Interpreter', 'latex')

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

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

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

Тем не менее, двузначные числа выглядят ужасно.

, 'Interpreter', 'latex')

Тем не менее, двузначные числа выглядят ужасно.

, 'Interpreter', 'latex')

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

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

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

Тем не менее, двузначные числа выглядят ужасно.

рад, что это помогло :)
милая!!!!!!! Это действительно помогает. Спасибо. Я знаю некоторые основы TeX, но не пользуюсь им в течение последних 10 лет; Я прекратил использовать его, как только понял, что он потребляет слишком много клеток моего мозга, чтобы ознакомиться с инструментом, которым я не пользуюсь часто. :-( Jason S
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)

screenshot

Сравните с решением на основе LaTeX, которое@catchmeifyoutry предложено (обратите внимание на двузначные числа):

%# use LaTeX to draw circled text at vertices
%#str = num2str((1:N)', '$\\textcircled{%d}

screenshot_latex

); str = num2str((1:N)', '$\\raisebox{.5pt}{\\textcircled{\\raisebox{-.9pt} {%d}}}

screenshot_latex

); text(XY(:,1), XY(:,2), str, ... 'HorizontalAlign','right', 'VerticalAlign','bottom', ... 'Interpreter','latex', 'FontSize',18)

screenshot_latex

ох, интересно! Мне придется попробовать это, когда у меня будет шанс. Jason S

Похожие вопросы