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' の例に焦点を当てています。:( 対数スケール値のない 2 番目の y 軸を持つ ISO 分類

4

1 に答える 1

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をまったく使用しないでください。それは苦痛です... . Figure を pdf ( set(gcf,'renderer','painters')) として保存し、ベクター グラフィックス プログラムまたは直接 LaTeX/Tikz で後処理を行います。

回答パート II

2 番目の軸を取得するには、次を使用します。

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 に答える