0

我有一个脚本,它将一些光学数据与洛伦兹振荡器的总和相匹配,然后用原始数据和拟合输出一个数字。我还想包含一个带有拟合参数表的文本注释,但无法弄清楚如何在我的文本框中获取行和列。

每个峰有 3 个参数,然后还有 3 个全局拟合参数。我的第一次尝试是这样做:

ParamTableLabels = {'\omega_p (cm^{-1})', '\omega_0 (cm^{-1})', '\Gamma (cm^{-1})'};
ParamTableVals = num2cell(Ef);
ParamTableLabels2 = {'d (\mu{m})','\epsilon_\infty','Scale'};
ParamTableVals2 = {ThickFit,EinfFit,ScaleFit};
ParamTable = vertcat(ParamTableLabels,ParamTableVals,ParamTableLabels2,ParamTableVals2);

其中 Ef 是我的 3xN 拟合参数矩阵。生成我的图形后,我尝试使用以下方法将表格放置在一组合适的坐标 X、Y 处:

text(X,Y,ParamTable)

结果是单列文本,没有行。我的第二次尝试,哪种作品是分解每一列:

text(X,     Y,ParamTable(:,1));
text(X+dX,  Y,ParamTable(:,2));
text(X+2*dX,Y,ParamTable(:,3));

这几乎可以工作,但是标签中的下标会影响最后几行的垂直对齐,并且需要大量的修补才能使间距正确。我花更多的时间试图让文本框看起来正确而不是进行实际建模。

如何以编程方式将包含标签和变量的文本块格式化为行和列,然后将其用作图形中的文本注释,而用户修改最少?

4

1 回答 1

0

使用基本命令不太支持此功能。但是,通过让 Matlab 为您完成这项工作,您至少可以省去猜测后续 X 位置的麻烦。

键是"Extent"附加到文本块的只读参数。用于docsearch text properties查看文档。

将其放入一些代码中:

        padFraction = 0.1;  %This is roughly the unitless padding between columns, as a fraction of the column on the left.
        curX = X;           %Leave the initial X variable unchanged


        %For each text block column, add the text block, get the extent, and adjust curX
        h = text(curX,     Y,ParamTable(:,1));
        curExtent = get(h, 'Extent');
        curX = curExtent(1) + curExtent(3)*(1+padFraction);

        h = text(curX,  Y,ParamTable(:,2));
        curExtent = get(h, 'Extent');
        curX = curExtent(1) + curExtent(3)*(1+padFraction);

        text(curX,Y,ParamTable(:,3));

用于生成/测试的完整脚本如下:

ParamTableLabels = {'\omega_p (cm^{-1})', '\omega_0 (cm^{-1})', '\Gamma (cm^{-1})'};

Ef = round(rand(10,3)*100);
ParamTableVals = num2cell(Ef);
ParamTableLabels2 = {'d (\mu{m})','\epsilon_\infty','Scale'};
ParamTableVals2 = {'ThickFit','EinfFit','ScaleFit'};
ParamTable = vertcat(ParamTableLabels,ParamTableVals,ParamTableLabels2,ParamTableVals2);

X = 1;  Y = 1.1;


%Put something in the plot
figure(1); clf; hold on;
plot(-10:10, randn(21,1)*20,'.');

codeblock = 3;
switch codeblock
    case 1
        text(X,Y,ParamTable)

    case 2
        dX = 3;
        text(X,     Y,ParamTable(:,1));
        text(X+dX,  Y,ParamTable(:,2));
        text(X+2*dX,Y,ParamTable(:,3));

    case 3
        padFraction = 0.1;
        curX = X;

        h = text(curX,     Y,ParamTable(:,1));
        curExtent = get(h, 'Extent');
        curX = curExtent(1) + curExtent(3)*(1+padFraction);

        h = text(curX,  Y,ParamTable(:,2));
        curExtent = get(h, 'Extent');
        curX = curExtent(1) + curExtent(3)*(1+padFraction);

        text(curX,Y,ParamTable(:,3));
end    
于 2013-03-18T19:18:49.993 回答