1

最近我正在尝试为道路评估实施 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中实现这一点? 带标签的 ISO 分类

Q2:另外,我想在“loglog”图的右侧添加另一个 y 轴,没有对数刻度值,如下图所示。如何做到这一点?我在官方网站上参考了很多例子,但大部分都集中在'plot'/'plotyy'例子上。:( 带有第二个 y 轴的 ISO 分类,没有对数刻度值

4

1 回答 1

1

回答第一部分

将文本放在某处的常用方法是注释功能。使用它的基本功能很难做到正确,所以宁愿将它与乳胶解释器一起使用,因为它允许您指定每行之间的间隙'\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')) 并使用任何矢量图形程序或直接使用 LaTeX/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')

会给(未调整大小):

在此处输入图像描述

于 2015-06-07T11:24:39.463 回答