如何在每一行添加标签,并添加第二个y轴的“双对数”情节的右侧?(How to add labels

2019-10-23 07:27发布

最近我想实现的巷道评估ISO分类。 请参阅本文中使用车辆的加速度测量来估算路面不平度 。 但是,我碰到了大约绘制ISO分类图的一些问题。 的代码如下所示:

%% generate ISO Clasification Curve (m^2/(rad/m))
AngSpaFre = 10^(-3):0.01:10^2;                                  % spatial frequency (rad/m)
ParamTable = [0              1*10^(-6)       2*(10^(-6));       % ISO classification parameters
              2*(10^(-6))    4*(10^(-6))     8*(10^(-6));       % (lower bound, geometric average, upper bound)
              8*(10^(-6))    16*(10^(-6))    32*(10^(-6));
              32*(10^(-6))   64*(10^(-6))    128*(10^(-6));
              128*(10^(-6))  256*(10^(-6))   512*(10^(-6));
              512*(10^(-6))  1024*(10^(-6))  2048*(10^(-6));
              2048*(10^(-6)) 4096*(10^(-6))  8192*(10^(-6));
              8192*(10^(-6)) 16384*(10^(-6)) 32768*(10^(-6))];
class_num = 8;
len = length(AngSpaFre);
iso_table = zeros(class_num, len);
for i = 1:class_num
  geo_mean = ParamTable(i, 2);
  geo_upbound = ParamTable(i, 3);
  for j = 1:len
    if(AngSpaFre(j) <= 1)
        iso_table(i,j) = geo_mean*(AngSpaFre(j)^(-2));
    else
        iso_table(i,j) = geo_mean*(AngSpaFre(j)^(-1.5));
    end
  end
end

figure,
ht = loglog(AngSpaFre, iso_table(1,:), AngSpaFre, iso_table(2,:), AngSpaFre, iso_table(3,:), AngSpaFre, iso_table(4,:), AngSpaFre, iso_table(5,:), AngSpaFre, iso_table(6,:), AngSpaFre, iso_table(7,:), AngSpaFre, iso_table(8,:));
hY = get(gca,'ylim');
hold on;
loglog([1 1], hY);
xlabel('Spatial Frequency \Omega (rad/m)');
ylabel('PSD (m^2/(rad/m))'); 
title('ISO Classification (log-log scale)');

而目前的结果显示为图波纹管:

然后2个问题来自于我的实现,并希望任何一个可以给我一些解决方案或简单的例子来使问题清晰。

Q1:由于分类曲线应该认识到道路的质量水平。 所以我想添加的每个线以下的标签,以显示像下面的图中的水平。 我怎么能认识到这一点在MATLAB?

Q2:另外,我想在“双对数”情节的右侧添加其他y轴没有像下图数刻度值。 如何实现这一目标? 我指的是官方网站的例子很多,但大多数集中在“阴谋” /“plotyy”的例子。 :(

Answer 1:

答第I部分

把文本的地方的常用方法是注释功能。 这是相当难做到正确使用它的基本功能得到它,所以,与其因为它允许您指定每行之间的差距与乳胶解释使用'\vspace{gapwidth}'和很多更多的选择

strings = {'H','G','F','E','D','C','B','A'};
verticalspace = '\vspace{4pt}';
str = cellfun(@(x) [x verticalspace],strings,'uni',0);


annotation('textbox', [0.4,0.6,0.1,0.1],...
           'String', str,...
           'LineStyle','none','Interpreter','latex');

这绝对是繁琐的,你应该使用一个固定的数字宽度。

另一种方法是使用自定义的数据提示 ,并根据需要调整它们。 优点是文本框的位置是相对于你的数据,而不是数字。

我一般建议: 不要用Matlab都做这样的调整 ,这是在一个痛苦...。 保存你的身材为PDF( set(gcf,'renderer','painters')并与任何矢量图形程序或直接与胶乳/ Tikz做后期处理。

回答第二部分

获得第二轴,使用方法:

ax1 = gca;
ax2 = axes('Position',ax1.Position,'Color','none');
ax2.YAxisLocation = 'right';
ax2.YLim = [0, 120];
ax2.YTick = 0:10:120;
ax2.XTick = [];

再次,之前指定确切的数字的尺寸! 调整后只是让烦恼。

摘要

一起下你当前的代码:

%%
f = gcf;
f.Units = 'pixels';
f.Position = ([100,100,1000,800]);

%%
strings = {'H','G','F','E','D','C','B','A'};
verticalspace = '\vspace{7.6pt}';
str = cellfun(@(x) [x verticalspace],strings,'uni',0);

annotation('textbox', [0.4,0.61,0.1,0.1],...
           'String', str,...
           'LineStyle','none','Interpreter','latex');

%%
ax1 = gca;
ax2 = axes('Position',ax1.Position,'Color','none');
ax2.YAxisLocation = 'right';
ax2.YLim = [0, 120];
ax2.YTick = 0:10:120;
ax2.XTick = [];
linkaxes([ax1,ax2],'x')

将使(不调整):



文章来源: How to add labels on each line and add 2nd y-axes to the right side of the 'loglog' plot?