Grafika: Wykresy w MATLAB-ie z formatowaniem opisów w LaTeX

Tworzenie wykresów w MATLAB-ie z użyciem LaTeX do opisu osi, tytułów i legend.

Grafika: Wykresy w MATLAB-ie z formatowaniem opisów w LaTeX

Dla grafików tworzenie grafiki jest naturalne, natomiast dla osób zajmujących się obliczeniami i modelowaniem stanowi odrębne wyzwanie.

Realizuję to poprzez kodowanie:

  • wykresy tworzę w MATLAB-ie oraz w Pythonie (Matplotlib),
  • stosuję interpreter LaTeX, żeby uzyskać skład tekstu spójny z resztą dokumentu,
  • rysunki tworzę w TikZ (pakiet LaTeX do rysowania m.in. schematów elektrycznych i blokowych).

Pozwala to uzyskać wysoką jakość grafik z wykorzystaniem zapisu matematycznego i skryptowania.

W tym wpisie pokazuję przykład wykresu w MATLAB-ie, zawierający na jednym rysunku wszystkie najważniejsze elementy. Przykłady w Pythonie i TikZ opiszę osobno.

Osobnym tematem są nieco bardziej złożone rysunki: układy wielowykresowe (funkcja subplot), insety, podwójne osie (lewa i prawa oś Y) oraz bardziej zaawansowane formatowanie. Opiszę je w osobnych wpisach.

Wykres tłumionego przebiegu oscylacyjnego w MATLAB-ie

Poniżej znajduje się przykładowy wykres zapisany jako grafika PNG do osadzenia w dokumencie.

Jest to wykres funkcji:

\[i(t)=I_\mathrm{m}\cos(\omega t)\,\mathrm{e}^{-t/\tau},\]

gdzie: $I_\mathrm{m} = 1$ – maksymalna wartość amplitudy [p.u.], $f = 50$ – częstotliwość [Hz], $\omega = 2\pi f$ – częstotliwość kątowa [rad/s], $\tau = 0.05$ – stała czasowa [s].

Przebieg oscylacyjny tłumiony Rys. 1. Przebieg oscylacyjny tłumiony.

Pliki wykorzystane w przykładzie:

Kod MATLAB

Minimalny przykład wykresu zawierający najważniejsze elementy: przebieg, obwiednię, opisy osi, legendę.

Kluczowe ustawienie: interpreter LaTeX jako domyślny dla wszystkich elementów tekstowych.

Opis znajduje się bezpośrednio w komentarzach w kodzie.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
%% MATLAB settings
clc; clear; format compact;

%% Graphics settings
% Use LaTeX for axis labels, text, and legend
set(groot, ...
    'defaultAxesTickLabelInterpreter','latex', ...
    'defaultTextInterpreter','latex', ...
    'defaultLegendInterpreter','latex');

% Global graphics defaults for consistent appearance
set(groot, ...
    'defaultLineLineWidth',1.15, ...
    'defaultAxesFontSize',12, ...
    'defaultTextFontSize',12);

% Figure size: [left, bottom, width, height] in points
set(gcf, 'Units', 'points', 'Position', [200,150,500,200]);

%% Signal parameters
% Cosine current with exponentially decaying amplitude
Im  = 1;          % peak current amplitude
f   = 50;         % frequency [Hz]
w   = 2*pi*f;     % angular frequency [rad/s]
tau = 0.05;       % time constant [s]

%% Time vector and waveform definition
% Signal computed over 1 s
t = 0:1e-4:1;     

% Damped oscillatory current waveform
i = Im*cos(w*t).*exp(-t/tau);

% Positive exponential envelope
envelope = Im*exp(-t/tau);

%% Plot
% Color definitions
blueColor = [0.0000 0.4470 0.7410];
redColor  = [0.8500 0.3250 0.0980];

% Plot with handles
hp1 = plot(t, i, 'Color', blueColor); hold on; grid on;
hp2 = plot(t, envelope, '--', t, -envelope, '--');
set(hp2, 'Color', redColor);
hold off;

%% Axes limits
xlim([0 200]*1e-3); % Only initial transient part is displayed, 0-200 ms
ylim(1.19*[-1 1]);  % Approximately 1.2

%% Axis ticks and labels
% Time axis in milliseconds for easier interpretation
xtick_values = 0:20e-3:200e-3;
xticks(xtick_values);
xticklabels(num2str(xtick_values'*1e3));
xlabel('$t\:[\mathrm{ms}]$');

% Y-axis normalized to peak current Im
yticks([-1 0 1]);
yticklabels({'$-I_\mathrm{m}$','0','$I_\mathrm{m}$'});
ylabel('$i(t)$');

%% Title and legend
title('$i(t)=I_\mathrm{m}\cos(\omega t)\,\mathrm{e}^{-t/\tau}$');

legend([hp1 hp2(1)], ...
    {'$i(t)$', '$\pm\,I_\mathrm{m}\,\mathrm{e}^{-t/\tau}$'}, ...
    'Location','northeast');

%% Export figure
% PDF (vector graphics) – suitable for LaTeX documents
exportgraphics(gcf, 'current_oscillatory_waveform.pdf');

% PNG (raster graphics) – suitable for web use
exportgraphics(gcf, 'current_oscillatory_waveform.png', 'Resolution', 300);

Domyślna paleta kolorów MATLAB (RGB)

Plik z domyślną paletą kolorów MATLAB dostępny jest tutaj (warto mieć ją pod ręką przy tworzeniu wykresów).

Fragment kodu:

1
2
3
4
5
6
7
8
9
10
%% MATLAB default color order (RGB)
% Order matches MATLAB default axes ColorOrder

blueColor       = [0.0000 0.4470 0.7410]; % blue
redColor        = [0.8500 0.3250 0.0980]; % red
yellowColor     = [0.9290 0.6940 0.1250]; % yellow
purpleColor     = [0.4940 0.1840 0.5560]; % purple
greenColor      = [0.4660 0.6740 0.1880]; % green
lightBlueColor  = [0.3010 0.7450 0.9330]; % light blue
darkRedColor    = [0.6350 0.0780 0.1840]; % dark red

Są to kolory używane domyślnie przez MATLAB dla kolejnych serii danych na wykresie.

Przykładowy wykres:

Przebiegi oscylacyjne tłumione dla różnych stałych czasowych Rys. 2. Przebiegi oscylacyjne tłumione dla różnych stałych czasowych.

Pliki wykorzystane w przykładzie:

Uwagi

  • Interpreter LaTeX w MATLAB-ie obsługuje tylko podzbiór składni LaTeX (nie jest to pełny LaTeX).
  • Warto eksportować wykresy do PDF (format wektorowy), a nie tylko do PNG.

Podsumowanie

Podejście skryptowe pozwala uzyskać powtarzalne i wysokiej jakości wykresy.

Koduję → rysuję → jest fajnie.

© Marcin Szewczyk. Wszelkie prawa zastrzeżone.