Как добавить метки в каждой строке и добавить 2-ые оси y в правую часть графика "loglog"?

В последнее время я пытаюсь внедрить классификацию 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)');

А текущий результат показан ниже на рисунке:

Затем в моей реализации появятся два вопроса, и я надеюсь, что любой сможет дать мне несколько решений или простых примеров, чтобы прояснить проблемы.

Q1: Поскольку классификационная кривая должна распознавать уровень качества дороги. Поэтому я хотел бы добавить метки ниже каждой строки, чтобы указать уровень, как на графике ниже. Как я могу понять это в Matlab? ISO классификация с этикетками

Q2: Кроме того, я бы хотел добавить еще одну ось Y справа от графика 'loglog' без значений масштаба журнала, как показано на рисунке ниже. Как этого добиться? Я ссылаюсь на множество примеров на официальном сайте, но большинство фокусируется на примерах "plot" / "plotyy".:(Классификация ISO со 2-й осью Y без значений логарифмической шкалы

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')) и выполните постобработку с помощью любой векторной графической программы или непосредственно с LaTeX/Tikz.

Ответ Часть II

Чтобы получить вторую ось, используйте:

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')

даст (не изменил размер):

введите описание изображения здесь

Другие вопросы по тегам