如何将MATLAB图形文本注释格式化为行和列?

如何将MATLAB图形文本注释格式化为行和列?,matlab,matlab-figure,Matlab,Matlab Figure,我有一个脚本,它将一些光学数据拟合成洛伦兹振荡器的和,然后用原始数据和拟合得到一个数字。我还希望包含一个带有拟合参数表的文本注释,但无法确定如何在文本框中获取行和列 每个峰值有3个参数,然后还有3个全局拟合参数。我的第一次尝试是: ParamTableLabels = {'\omega_p (cm^{-1})', '\omega_0 (cm^{-1})', '\Gamma (cm^{-1})'}; ParamTableVals = num2cell(Ef); ParamTableLabels2

我有一个脚本,它将一些光学数据拟合成洛伦兹振荡器的和,然后用原始数据和拟合得到一个数字。我还希望包含一个带有拟合参数表的文本注释,但无法确定如何在文本框中获取行和列

每个峰值有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));
这几乎是可行的,但是标签中的下标偏离了最后几行的垂直对齐,并且需要过多的修改才能获得正确的间距。我花了更多的时间试图让文本框看起来比实际建模更合适


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

这是一个基本命令无法很好地支持的问题。但是,通过让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    

当包含的代码是独立的可执行文件时,它总是很好的。例如,此代码缺少对
Ef
ThickFit
等的定义,即使您创建了随机数据。这非常有用。下标和上标仍然会弄乱每列的垂直范围,因此表的底部是参差不齐的,但是使用“范围”,我想我可以将标题和数字视为单独的文本块并对齐它们。