最近我正在尝试实施道路评估的ISO分类。请参阅论文The use of vehicle acceleration measurements to estimate road roughness。但我提出了一些关于绘制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:另外,我想在'loglog'图的右侧添加另一个y轴,而没有如下图所示的对数刻度值。怎么做到这一点?我在官方网站上提到了很多例子,但大多数都集中在'情节'/'plotyy'的例子上。 :(
答案 0 :(得分:1)
将文本放在某处的常用方法是annotation函数。使用基本功能很难做到这一点,所以请将它与乳胶解释器一起使用,因为它允许您指定每行'\vspace{gapwidth}'
和很多more options:
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');
它非常繁琐,你应该使用固定的数字宽度。
另一种方法是使用custom datatips并根据需要调整它们。优点是文本框的位置与您的数据相关而不是数字。
我的一般建议:根本不使用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')
会给(未调整大小):