2012-05-30 27 views
6

Quiero poner un número en un círculo en un gráfico como cerca de (pero no en) un punto. Suena fácil, pero también quiero ser invariante de los cambios de relación de zoom/aspecto.matlab: poner un número en un círculo en un gráfico

Debido a esta invariante, no puedo dibujar un círculo como un objeto de línea (sin volver a dibujar al reescalar); si uso un marcador de círculo, tendría que ajustar su desplazamiento al reescalar.

El enfoque más simple que puedo pensar es utilizar los caracteres Unicode o Wingdings & # x2460; & # x2461; & # x2462; etc. en una cadena para la función text(). Pero unicode no parece funcionar bien, y la siguiente muestra solo funciona con & # x2460; y no para los demás números (que producen cajas rectángulo):

obras:

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

no funciona (debe ser un círculo 2):

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

lo que da, y puede ¿Alguien sugiere una solución alternativa?

Respuesta

8

Esto parece funcionar para mí, utiliza el intérprete de látex de Matlab, y \textcircled:

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

El comando \textcircled parece tienen algún offset problems, tal vez usted puede tratar de mejorar el comando de látex utilizado y hacernos saber :)

Siguiendo el enlace de arriba, por ejemplo, consigo mejores resultados con:

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

Aún así, dos dígitos los números se ven horribles

+0

dulce !!!!!!! Eso realmente ayuda. Gracias. Conozco algunos conceptos básicos de TeX, pero no los he usado demasiado en los últimos 10 años. Dejé de usarlo una vez que descubrí que estaba tomando demasiadas células cerebrales para familiarizarme con una herramienta que no uso tan a menudo. :-( –

+0

contento de haber ayudado :) – catchmeifyoutry

6

He aquí un ejemplo en el que los marcadores (texto + círculos) son invariantes para ampliar/cambiar el tamaño:

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

comparar con la solución a base de látex que @catchmeifyoutry propuesto (prestar atención a la números de dos dígitos):

%# 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, ¡interesante! Tendré que probar esto cuando tenga oportunidad. –

Cuestiones relacionadas