Jak uniknąć ręcznego formatowania każdego rysunku z osobna w MATLABie? Wystarczy stworzyć szablon oraz prostą funkcję, po wywołaniu której każdy rysunek będzie wyglądał tak jak tego chcemy. Praca z rysunkami w MATLABie może być przyjemna!
W poprzednim poście pisałem o tym jak zarządzać rysunkami oraz zmieniać ich właściwości z poziomu kodu programu. Jednak jeżeli generujemy dużo rysunków to ich formatowanie w ten sposób jest niewygodne, gdyż trzeba za każdym razem kopiować pod funkcją, która rysuje np. plot kolejne komendy, które zmienią wygląd i opis naszego rysunku.
Rozwiązaniem tego problemu jest stworzenie szablonu według którego będą formatowane wszystkie rysunki.
Krok pierwszy – tworzenie szablonu
Tworzymy w MATLABie rysunek z jakąkolwiek zawartością, np. funkcją: plot([0 1], [2 2]).
To co jest rysowane nie ma znaczenia, gdyż szablon i tak będzie „pusty”, chodzi tylko o utworzenie okna z rysunkiem.
Następnie w aktywnym oknie z rysunkiem wybieramy Edit -> Figure properties. Otworzy się okno Property Inspector, w którym mamy dostęp do właściwości naszego okna.

Możemy zmieniać tu szereg właściwości: od koloru tła okna, przez jego położenie, używaną palete kolorów dla wielu wykresów, itd. Jeżeli macie potrzebę dostosować któreś z właściwości okna do swoich potrzeb, to jest to odpowiednie miejsce.
Po dostosowaniu okna, należy odnaleźć zakładkę ‘PARENT/CHILD’ i kliknąć Children -> Axes, bądź w aktywnym oknie po prostu kliknąć na środek rysunku gdzie jest wykres. Spowoduje to, że w oknie Property Inspector będą wyświetlone właściwości obiektu Axes, czyli naszego płótna na którym rysujemy wykres. To prawdopodobnie tu będziemy zmieniać najwięcej ustawień:

Mamy tu dostęp do wszystkich właściwości rysunku, które możemy łatwo dostosować do swoich potrzeb, bez konieczności wpisywania komend w kodzie programu. Warto posprawdzać wszystkie zakładki, gdyż każdy element rysunku można dostosować do swoich potrzeb. Zwracam uwagę na zakładkę RULERS i XAxis -> NumericRuler. Po kliknięciu tej nazwy, przechodzimy do właściwości opisu osi rysunku. Z kolei po kliknięciu na narysowaną linię, lub przez zakładkę PARENT/CHILD –> Line, ustawiamy grubość, kolor i rodzaj rysowanej linii.
Po ustawieniu wyglądu okna według własnych preferencji, warto je zapisać na dysku.
Etap drugi – generacja funkcji
Jeżeli szablon jest gotowy, można wygenerować funkcję, która będzie zawierać program formatujący rysunek, przez File -> Generate code. Argumentami funkcji są dane X i Y do narysowania. Jest to dobre rozwiązanie dla nowych rysunków, ale co gdy chcemy sformatować rysunek już istniejący? Z taką sytuacją mamy najczęściej do czynienia: najpierw wywołujemy funkcję np. plot, rysujemy wykres lub kilka wykresów, a później chcemy tak utworzony rysunek sformatować. Aby ten efekt uzyskać, należy nieco zmodyfikować ciało utworzonej funkcji.
Poniżej znajduje się fragment głównego programu, oraz treść funkcji – szablonu, który formatuje dowolny rysunek, narysowany funkcją plot. Oba programy należy zapisać w tym samym katalogu, w dwóch m-plikach, dbając o to by nazwa pliku funkcji była zgodna z nazwą funkcji czyli my_figure.
Główny program:
close all; clear all; clc
%% Główny program wywołujący funkcję my_figure
% (powinna być w osobnym pliku o tej samej nazwie)
%% Podejście klasyczne
figure;
plot([0 1 2 3], [0 0 1 1]);
hold on; plot([0 1 2 3], [2 2 3 4])
xlabel('Opis osi X')
ylabel('Opis osi Y')
title('Tytuł rysunku')
grid on
% i w tym miejscu musiałyby być komendy formatujące rysunek...
%% Podejście alternatywne - szablon
figure;
plot([0 1 2 3], [0 0 1 1]);
hold on; plot([0 1 2 3], [2 2 3 4])
my_figure('Opis osi X', 'Opis osi Y', 'Tytuł rysunku');
Funkcja - szablon:
function my_figure(opisX, opisY, tytul)
%% Zmienione argumenty wejściowe funkcji na opisy osi!
%% CREATEFIGURE2(X1, Y1) <-- Taka była pierwotna składnia funkcji.
% X1: vector of x data
% Y1: vector of y data
% Auto-generated by MATLAB on 18-Mar-2020 10:38:53
% Create figure
% figure1 = figure; % To usuwamy, gdyż rysunek będzie tworzony
% na zewnątrz funkcji
% Create axes
% axes1 = axes; % To również usuwamy, gdyż obiekt axes, jest już
% stworzony na aktywnym rysunku
axes1 = gca;
hold(axes1,'on');
% Create plot
% plot(X1,Y1,'LineWidth',2); % To samo dotyczy linii
% Create ylabel
% ylabel({'Opis osi Y'}); % Podmieniamy, tak aby móc wprowadzać
ylabel(opisX); % swój tekst. Podobnie z xlabel i title
% Create xlabel
xlabel(opisY);
% Create title
title(tytul);
% Uncomment the following line to preserve the X-limits of the axes
% xlim(axes1,[0 1]);
box(axes1,'on');
% Set the remaining axes properties
set(axes1,'FontName','Century Gothic','FontSize',12,...
'LabelFontSizeMultiplier',1.3,'TitleFontSizeMultiplier',1.3,'XGrid','on',...
'LineWidth',1,'TickLength',[0.02 0.025],'XMinorTick','on','YGrid','on','YMinorTick','on');
%% Jeżeli rysunek zawiera więcej niż jedną linia, konieczna jest pętla:
liczba_lini = size(axes1.Children);
for k = 1 : liczba_lini
axes1.Children(k,1).LineWidth = 2;
end
W efekcie uruchomienia głównego programu, dostaniemy dwa poniższe rysunki, z formatowaniem domyślnym MATLABa i takim jaki ja preferuje.. Ten drugi jest dużo bardziej czytelny, a co więcej takie formatowanie od teraz uzyskamy przez jednokrotne wywołanie funkcji my_figure! Powodzenia w eksperymentowaniu z rysunkami!
Oryginalne formatowanie MATLABa:

Formatowanie wg szablonu:

