MATLAB SZABLONY RYSUNKÓW

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:
(Visited 169 times, 1 visits today)

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *