2012-05-30 57 views
6

Tôi muốn đặt một số vòng tròn trên biểu đồ dưới dạng điểm đánh dấu gần (nhưng không bật) một điểm. Nghe có vẻ dễ dàng, nhưng tôi cũng muốn là bất biến của các thay đổi tỷ lệ thu phóng/khía cạnh.matlab: đặt một số vòng tròn lên một biểu đồ

Bởi vì điều này bất biến, tôi không thể vẽ một vòng tròn như là một đối tượng dòng (mà không vẽ lại nó khi rescale); nếu tôi sử dụng điểm đánh dấu vòng tròn, tôi sẽ phải điều chỉnh độ lệch của nó khi rescale.

Cách tiếp cận đơn giản nhất tôi có thể nghĩ là sử dụng các ký tự Unicode hoặc Wingdings & # x2460; & # x2461; & # x2462; vv trong một chuỗi cho hàm text(). Nhưng unicode dường như không hoạt động đúng và mẫu sau chỉ hoạt động với & # x2460; và không cho các số khác (mà mang hộp hình chữ nhật):

công trình:

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

không hoạt động (nên được một vòng 2):

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

gì mang lại, và có thể bất cứ ai đề nghị một workaround?

Trả lời

8

Điều này dường như làm việc cho tôi, sử dụng thông dịch mủ Matlab, và \textcircled:

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

Lệnh \textcircled dường như có một số offset problems, có lẽ bạn có thể cố gắng cải thiện lệnh latex sử dụng và cho chúng tôi biết :)

Sau khi đăng ký tài khoản, ví dụ, tôi nhận được kết quả tốt hơn với:

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

Tuy nhiên, hai chữ số con số trông khủng khiếp.

+0

ngọt ngào !!!!!!! Điều đó thực sự hữu ích. Cảm ơn bạn - Tôi biết một vài điều cơ bản trong TeX nhưng chưa sử dụng nhiều trong 10 năm qua; Tôi đã ngừng sử dụng nó khi tôi nhận ra rằng nó đã lấy quá nhiều tế bào não của tôi để làm quen với một công cụ mà tôi không sử dụng thường xuyên. :-( –

+0

vui vì nó đã giúp :) – catchmeifyoutry

6

Dưới đây là một ví dụ nơi đánh dấu (văn bản + hình tròn) là bất biến để phóng to/thay đổi kích thước:

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

Hãy so sánh với các giải pháp LaTeX dựa trên @catchmeifyoutry đề xuất (chú ý đến số có hai chữ số):

%# 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, thú vị! Tôi sẽ phải thử điều này khi tôi có cơ hội. –

Các vấn đề liên quan