2013-08-03 26 views
6

Tôi đang sử dụng MATLAB để vẽ các phân tích XRD trong đó các chỉ mục Miller được sử dụng để xác định các hướng của mặt phẳng tinh thể. Các chỉ mục này chứa 3 hoặc 4 số và giá trị âm được hiển thị với thanh trên số này.Làm thế nào để hiển thị các chỉ số Miller trong MATLAB?

Trong LaTeX, có thể viết bằng lệnh \([1\bar{1}1]\) hoặc \([1\overline{1}1]\).

Để dán nhãn các dòng phổ của các tiêu chuẩn XRD Tôi đang sử dụng lệnh này: Lưu ý rằng các giá trị âm không được xem xét.

std_text_hkl(j)=text(theta{i}(j)-r,0.1,['[' hkl{j} ']'],... % position and label 
     of j-th line of i-th standard; hkl{j} holds Miller index in string format 
    'parent',ax_std(i),... % association with axes of i-th standard 
    'rotation',90,... 
    'fontsize',12,... 
    'fontname',Font); % Font holds global font setup 

Làm thế nào tôi có thể tự động tạo thanh trên số âm mà không sử dụng 'Interpreter','latex' sở hữu kể từ khi tôi muốn để có thể thay đổi 'FontName' là tốt tài sản. Tại leat tôi muốn tránh phông chữ khác nhau trong nhãn và bọ ve.

EDIT:
Nhờ bình luận Magla của tôi có ý tưởng này:

  • cửa hàng chỉ số như ma trận 3 cột
  • nhãn hiệu riêng biệt thành 5 lĩnh vực văn bản
  • nếu Miller chỉ là dòng hòa âm trên nó (dòng trên cùng của khung văn bản)

Đoạn mã thực tế:

rr=get(ax_std(i),'xlim'); % read x-axis limits of i-th standard 
    r=(rr(2)-rr(1))/150; % x-offset of Miller indexes 
    for j=1:size(dhkl,1) 
     theta{i}(j)=asin(lambda/(2*dhkl(j,1)))*360/pi(); %calculating of lines 
        %positions (Bragg's law) 
     line('parent',ax_std(i),... 
      'xdata',[theta{i}(j) theta{i}(j)],... 
      'ydata',[0 dhkl(j,2)],... % j-th line's reflection intensity 
      'color',[colors(1+mod(i-1,size(colors,1)),1:3)],... 
      'linewidth',3) 

%   Miller indexes 

     if theta{i}(j)>rr(1)&&theta{i}(j)<rr(2) % test if line is inside axes 
      std_text_lbrace(j)=text(theta{i}(j)-r,0.1,'[',... 
      'parent',ax_std(i),... 
      'verticalalignment','bottom',... 
      'horizontalalignment','left',... 
      'rotation',90,... 
      'fontsize',12,... 
      'fontname',Font); 
     pos=get(std_text_lbrace(j),'position'); 
     ext=get(std_text_lbrace(j),'extent'); 

     std_text_h(j)=text(pos(1),pos(2)+ext(4)/1.5,int2str(abs(hkl(j,1))),... 
      'parent',ax_std(i),... 
      'verticalalignment','bottom',... 
      'horizontalalignment','left',... 
      'rotation',90,... 
      'fontsize',12,... 
      'fontname',Font); % write 1st Miller index 
     pos=get(std_text_h(j),'position'); 
     ext=get(std_text_h(j),'extent') 
     if hkl(j,1)<0 % if negative, draw line over it 
      wdth=get(ax0,'xlim'); 
      wdth=wdth(2)-wdth(1); 
      set(std_text_h(j),'color','b','edgecolor','g') 
      line('parent',ax_std(i),... 
       'xdata',[pos(1)-wdth/280*ext(3),pos(1)-wdth/280*ext(3)],... 
       'ydata',[pos(2),pos(2)+ext(4)/wdth*100],... 
       'color','r') 
     end 
     end 

Tôi không thể vừa với chiều dài của đường. Đối với chữ số duy nhất nó quá dài, cho hai chữ số nó phù hợp và cho nhiều hơn (về mặt lý thuyết) đó là cách quá ngắn. Tôi đang làm gì sai? MATLAB đo lường tính chất 'extent' của văn bản được xoay vòng như thế nào?

+0

Tôi sẽ sử dụng trường văn bản thứ hai chỉ có dấu gạch dưới và dịch hoặc xoay nó để khớp với số mục tiêu. Giải pháp này hoạt động tốt với phông chữ khoảng cách đều nhau mặc dù (chuyển phát nhanh mới, monospaced). – marsei

+0

@Magla: Điểm tốt, '' _ \ newline [111] ''nên làm điều đó. Nhưng, như bạn nói, chỉ cho 'font chữ cố định' (có nên tăng gấp đôi khoảng trắng). – Crowley

+0

Bạn đã cosidered nhiều câu trả lời để "sử dụng nhãn mủ latex", ví dụ: http://stackoverflow.com/a/9328945/2180721.Điều này không cho phép sử dụng bất kỳ phông chữ nào, nhưng cách giải quyết được đề xuất bởi Magla chỉ áp dụng cho yêu cầu cụ thể của bạn và nếu bạn có một số mủ phức tạp để hiển thị, việc sử dụng các đối tượng đồ họa sẽ trở nên không khả thi. – Oleg

Trả lời

3

Dưới đây là một đoạn mã hiển thị các dòng ghi đè trên đầu số âm. Giải pháp này không sử dụng 'interpreter','latex' để người dùng có thể chọn các phông chữ khác nhau. Lưu ý rằng mã sử dụng một tập hợp các hộp văn bản đơn, mỗi hộp có một số \n hoặc char(10) để hiển thị trên đầu dòng gạch dưới (char(95) hoặc ' ' cho chữ số dương) và trên dòng dưới cùng số được liên kết. Người ta có thể chọn có hai hộp văn bản khác nhau để đặt khoảng cách cụ thể giữa dấu gạch dưới và số của nó. Đoạn mã này không hoạt động cho tất cả các phông chữ mặc dù (tôi có thể nói 90% phông chữ hệ thống của tôi hoạt động tốt).

Các mã sau

%Miller indices 
miller_ind = [1 -1 -2 3 -3]; 

%font definition 
c = listfonts; 
ind_perm = randperm(length(c)); 
font_names = {'Arial','Times','Courier New',c{ind_perm}}; 
font_size = 16; 

figure('Color','w','Position',[10 10 600 1000]); 
py = 0.05; 
for ind_font = 1:12 

    %font name 
    text(0.03,py,font_names{ind_font},'FontName',font_names{ind_font},'FontSize',font_size); 

    %plot miller textbox 
    px = 0.6; 
    for ii = 1:length(miller_ind) 
     if miller_ind(ii)<0 
      text(px,py,[char(95) char(10) num2str(-1*miller_ind(ii)) ],... 
       'FontName',font_names{ind_font},'FontSize',font_size,'interpreter','none'); 
     else 
      text(px,py,[' ' char(10) num2str(miller_ind(ii)) ],... 
       'FontName',font_names{ind_font},'FontSize',font_size,'interpreter','none'); 
     end 
     px = px + 0.03; 
    end 
    py = py + 0.09; 
end 

cho kết quả này

enter image description here

EDIT Thank để @Oleg Komarov để lấy ý kiến ​​của mình. Hình ảnh hiện được lưu trực tiếp dưới dạng a. tiff và không qua .eps.

+0

Những gì bạn thực sự hiển thị là các loại phông chữ khác nhau thực sự giống nhau. – Oleg

+0

oops - đó là sự thật - ít nhất là cho phần trên cùng của hình. May mắn thay, tôi đã thêm Arial, Courier New và Times ở phần dưới cùng và tôi có thể thấy chúng hiển thị khác nhau. Chỉnh sửa trên đường đi! – marsei

+0

Trên thực tế, tất cả 12 phông chữ được viết chính xác trong hình của Matlab. Có vẻ như 'tiết kiệm như eps' đã không hoạt động - xấu của tôi. Đã chỉnh sửa ảnh! Cảm ơn bạn đã chỉ ra điều này @Oleg Komarov. – marsei

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