我有一个脚本,它将一些光学数据拟合到洛伦兹振荡器的总和,然后用原始数据和拟合点出一个数字。我还想包含一个带有拟合参数表的文本注释,但无法弄清楚如何在我的文本框中获取行和列。
每个峰有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));
这几乎可以工作,但标签中的下标会抛弃最后几行的垂直对齐,并且需要进行过多的修补才能使间距正确。我花了更多的时间来让文本框看起来正确而不是进行实际建模。
我如何以编程方式将包含标签和变量的文本块格式化为行和列,然后将其用作图形中的文本注释,用户修改最少?
答案 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