Статья будет полезна тем, кто оформляет графики в среде Matlab.
При подготовке графиков для публикации статей в научных журналах и различного рода отчетов, я довольно часто сталкивался с необходимостью построения нескольких кривых, относящихся каждая к своей оси — чтобы не перегружать статью графиками и не выходить за их лимит. Но для этого в Matlab до версии R2014a была лишь команда plotyy(X1,Y1,X2,Y2), которая имеет ряд неприятных особенностей, из-за которых приходилось пользоваться другими программами и делать все вручную, что во-первых, усложняет этот процесс с точки зрения единой стилистики, во-вторых требует большого количества времени, а в-третьих не позволяет оперативно вносить изменения.
1. Отсутствие аналога hold on («родной» hold on работает не совсем корректно с plotyy). Для того, чтобы добавить более, чем 2 кривые необходимо использовать вот такую конструкцию:
[hAx,hLine1,hLine2] = plotyy([x1',x2'],[y1' y2'],[x3',x4'],[y3',y4']); %Добавляет 4 кривые
Из этой конструкции вытекает неприятная особенность №2:
2. Размерности массивов, заключенных в квадратные скобки должны совпадать, т.к. из них формируются матрицы элементов. На практике такое бывает очень не часто.
3. Оформление серьезно страдает оттого, что нельзя программными методами изменить цвета и типы всех линий подряд, можно форматировать только набор линий, относящихся к конкретной оси (hLine1 и hLine2) — во всяком случае, я не смог. При этом, я не говорю сейчас об изменении параметров руками, т.е. редактированием в окне «figure» — только непосредственно кодом в .m-файле.
Резюмируя вышесказанное: plotyy() не очень хорошо подходит для отображения нескольких наборов графиков для разных осей. Разве что для простеньких зависимостей типа этих:
x = linspace(0,10);
y1 = 200*exp(-0.05*x).*sin(x);
y2 = 0.8*exp(-0.5*x).*cos(10*x);
y3 = 0.2*exp(-0.5*x).*cos(10*x);
y4 = 150*exp(-0.05*x).*sin(x);
X=[x',x'];
Y1=[y1' y4'];
Y2=[y2',y3'];
[hAx,hLine1,hLine2] = plotyy(X,Y1,X,Y2);
То ли дело команда yyaxes, появившаяся в версии Matlab R2014a. Вот тут уж нам стало где развернуться.
Рассказать о прелестях данной команды я бы хотел на своем примере. Задача состоит в том, что мне необходимо построить на одном графике 3 профиля температур (решения, полученные прямым численным методом, моментным методом и экспериментальные значения), относящихся к правой оси, и 3 профиля давлений, относящихся к левой оси. А также добавить стрелки и подписи.
Команды yyaxis left и yyaxis right позволяют справиться с этой задачей на раз. В чем, собственно, суть. В рамках одной figure мы можем построить любое количество графиков, привязав их к одной из осей. В рамках каждой из команд прекрасно работает все то же самое, что и для обычных графиков.
Структура рисунка в таком случае будет выглядеть так:
figure()
{Здесь можно определить общие настройки - шрифт,
размер}
yyaxis left
{Все параметры, определенные в этом блоке - стили, цвета, метки, и прочее относится только к левой оси}
yyaxis right
{Все параметры, определенные в этом блоке - стили, цвета, метки, и прочее относится только к правой оси}
Наполнив эту структуру необходимым, получаем в результате:
% График во весь экран
h = figure('Units', 'normalized', 'OuterPosition', [0 0 1 1]);
% Настройки шрифта:
F='Times New Roman';
FN='FontName';
FS='FontSize';
l=30;% Размер шрифта
set(gca, FN, F, FS, l)
box on % Рамка
hold on
%% ПРАВАЯ ОСЬ
yyaxis right
hPlot_1 = plot(time*10^6, T); % Прямой численный метод
hPlot_2 =plot(time_exp_T*10^6, T_exp); % Экспериментальное значение
hPlot_3 =plot(time_pk, T_pk); % Моментный метод
set( hPlot_1, 'LineWidth', 3, 'LineStyle', ':', 'Color', 'k' );
set( hPlot_2, 'LineWidth', 1, 'LineStyle', 'none', 'Color', 'k', 'Marker', 'o' );
set( hPlot_3, 'LineWidth', 3, 'LineStyle', '--', 'Color', 'k' );
% Пределы по у (справа)
ylim([180 270]);
% Подписи осей по у (справа)
yticks([190 200 210 220 230 240 250 260 267])
yticklabels({'190', '200', '210', '220', '230', '240','250' '260', 'it T, K'})
% Цвет осей
set(gca,'xcolor','k');
set(gca,'ycolor','k');
%% ЛЕВАЯ ОСЬ
yyaxis left
hPlot_10 = plot(time_P*10^6, P_p0); % Прямой численный метод
hPlot_11 = plot(time_exp_P_p0*10^6, P_p0_exp); % Экспериментальное значение
hPlot_13 = plot(time_pk, Pp0_pk); % Моментный метод
set( hPlot_10, 'LineWidth', 3, 'LineStyle', ':', 'Color', 'k' );
set( hPlot_11, 'LineWidth', 1, 'LineStyle', 'none', 'Color', 'k', 'Marker', 'x' );
set( hPlot_13, 'LineWidth', 3, 'LineStyle', '--', 'Color', 'k' );
% Пределы по у (слева)
ylim([0.1 0.8]);
% Подписи осей по у (слева)
yticks([0.2 0.3 0.4 0.5 0.6 0.7 0.77])
yticklabels({'0.2', '0.3', '0.4', '0.5', '0.6', '0.7', 'it p/p_0 '})
% Цвет осей
set(gca,'xcolor','k');
set(gca,'ycolor','k');
%% ОФОРМЛЕНИЕ ГРАФИКОВ
% Маркеры и подписи оси Х
xticks([0 20 40 60 80 100 120 140 160 185])
xticklabels({'0' '20' '40' '60' '80' '100' '120' '140' '160', 'it X/U, мc'})
% СТРЕЛКИ
text(20,0.3,'leftarrow', FS, 60, FN, F);
text(140,0.6,'rightarrow', FS, 60, FN, F);
text(160,0.24,'1', FS, l, FN, F);
text(60, 0.25,'2', FS, l, FN, F);
text(120, 0.2,'3', FS, l, FN, F);
text(140,0.51,'4', FS, l, FN, F);
text(80, 0.52,'5', FS, l, FN, F);
text(120,0.48,'6', FS, l, FN, F);
text(5,0.75,'it D_2O - N_2', FS, l, FN, F);
hold off
Еще одна дополнительная фишка в подготовке графиков к печати — это их простое и удобное сохранение в любом, поддерживаемом Matlab-ом, формате. Для этого необходимо лишь добавить следующие строки:
%% СОХРАНЕНИЕ РЕЗУЛЬТАТОВ
file_name = strcat('T, p_p0 - mm, ch, exp'); % Имя файла
saveas(h, file_name, 'bmp'); % Формат .bmp
saveas(h, file_name, 'fig'); % Формат .fig
saveas(h, file_name, 'eps'); % Формат .eps
saveas(h, file_name, 'jpeg'); % Формат .jpeg
close(h); % Закрыть график после сохранения
Итог
Начиная с версии R2014a Matlab стал подходящей программой для подготовки графиков к публикации статей в различных научных журналах. Важным плюсом является очень хорошая гибкость этого инструмента, позволяющая обрабатывать результаты и представлять их в удобоваримом и красивом виде, в том числе и для т.н. «пакетной» обработки.
Сюда стоит заглянуть:
→ Полезная статья по графикам в Matlab-е
→ Описание yyaxis
→ Описание plotyy
→ Экспорт графиков
Автор: AlexSid93