如何将MATLAB图形文本注释格式化为行和列?
我有一个脚本,它将一些光学数据拟合成洛伦兹振荡器的和,然后用原始数据和拟合得到一个数字。我还希望包含一个带有拟合参数表的文本注释,但无法确定如何在文本框中获取行和列 每个峰值有3个参数,然后还有3个全局拟合参数。我的第一次尝试是:如何将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
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
等的定义,即使您创建了随机数据。这非常有用。下标和上标仍然会弄乱每列的垂直范围,因此表的底部是参差不齐的,但是使用“范围”,我想我可以将标题和数字视为单独的文本块并对齐它们。