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

时间:2013-03-18 18:47:53

标签: matlab matlab-figure

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

每个峰有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));

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

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

1 个答案:

答案 0 :(得分: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