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!