如何在MATLAB中显示Miller索引? [英] How to show Miller indexes in MATLAB?

查看:149
本文介绍了如何在MATLAB中显示Miller索引?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用MATLAB绘制XRD分析图,其中使用米勒指数来识别晶体学平面方向.这些索引包含3或4个数字,负数在该数字上显示为bar.

I'm using MATLAB to plot XRD analyses where Miller indexes are used to identify crystallographic plane directions. These indexes contain 3 or 4 numbers and negative value is shown with bar over this number.

在LaTeX中,可以通过\([1\bar{1}1]\)\([1\overline{1}1]\)命令编写.

In LaTeX it can be written by \([1\bar{1}1]\) or \([1\overline{1}1]\) command.

为标记XRD标准的光谱线,我使用此命令:请注意,不考虑负值.

For labeling spectral lines of XRD standards I'm using this command: Note that negative values are not considered.

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

如何在不使用'Interpreter','latex'属性的情况下自动创建负数栏,因为我也希望能够更改'FontName'属性.希望能避免在标签和刻度中使用不同的字体.

How can I automate creating bar over negative number without using 'Interpreter','latex' property since I would like to be able to change 'FontName'property aswell. At leat I'd like to avoid different fonts in labels and ticks.


多亏了Magla的评论,我才有了这个主意:


Thanks to Magla's comment I got this idea:

  • 将索引存储为3列矩阵
  • 将标签分成5个文本字段
  • 如果Miller索引在其上为负画线(文本框架的顶行)

实际代码段:

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

我不适合行长.对于单个数字来说,它太长了;对于两个数字,它就适合了;对于更多的数字(理论上),它太短了.我究竟做错了什么? MATLAB如何测量旋转文本的'extent'属性?

I can't fit the line length. For single digit it's too long, for two digits it fits and for more (theoretically) it's way too short. What am I doing wrong? How does MATLAB measure 'extent' property of rotated text?

推荐答案

此处是一段代码,在负数的顶部显示了上划线.此解决方案不使用'interpreter','latex',因此可以选择不同的字体.请注意,该代码使用一组单个文本框,每个文本框都有一个\nchar(10),以在下一行的下划线(对于正数为char(95)' ')显示下划线,并在其下一行显示相关的文本框.数字.可以选择使用两个不同的文本框来设置下划线及其编号之间的特定距离.这段代码虽然不适用于所有字体(我说我的系统字体中有90%可以正常工作).

Here is a piece of code that displays overlines on the top of negative digits. This solution does not use 'interpreter','latex' so that one may choose different fonts. Note that the code uses a set of single textboxes, each one having a \n or char(10) to display on the top line the underscore (char(95), or ' ' for positive digits) and on the bottom line the associated number. One can choose to have two different textboxes to set a particular distance between the underscore and its number. This piece of code does not work for all the fonts though (I would say 90% of my system fonts works fine).

以下代码

%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

给出此结果

编辑 感谢@Oleg Komarov的评论.图片现在直接保存为.tiff,而不是通过.eps.

EDIT Thank to @Oleg Komarov for his comment. Picture is now directly saved as a .tiff and not via .eps.

这篇关于如何在MATLAB中显示Miller索引?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆