Sei sulla pagina 1di 19

Introduzione all’uso di MATLAB

—————
Grafici bidimensionali e comando “plot()”
—————
Appunti per l’insegnamento di
Metodi Computazionali per la Finanza
Anno Accademico 2017/2018

Riccardo Cambini
Dipartimento di Economia e Management
Università di Pisa,
Via Cosimo Ridolfi 10, 56124 Pisa, ITALY
E-mail: riccardo.cambini@unipi.it

Versione Marzo 2018

Piattaforma E-learning : https://moodle.ec.unipi.it/course/view.php?id=513

1
Grafici bidimensionali in MATLAB
(Live Script realizzato con MATLAB versione 2018a)

clear % si svuota preliminarmente il Workspace di MATLAB per evitare problemi

Comando per tracciare un grafico


Un grafico in MATLAB è semplicemente una sequenza di punti eventualmente uniti da una linea. Per
tracciare un grafico occorre utilizzare il seguente comando:

plot(X,Y,opt); % comando per tracciare un grafico

dove:

- X rappresenta il vettore composto dai valori in ascissa dei vari punti

- Y rappresenta il vettore composto dai corrispondenti valori in ordinata dei punti

- opt è una stringa opzionale con cui specificare il colore, il simbolo ed il tipo di linea

In altre parole, il grafico che viene disegnato unisce tra loro la sequenza di punti [X(1),Y(1)], [X(2),Y(2)],
[X(3),Y(3)], [X(4),Y(4)], etc etc.

Come indicato nell’help di MATLAB le opzioni utilizzabili sono le seguenti:

COLORS SYMBOLS LINE TYPES


b blue . point - solid
g green o circle : dotted
r red x x-mark -. dashdot
c cyan + plus -- dashed
m magenta * star (none) no line
y yellow s square
k black d diamond
w white v triangle (down)
^ triangle (up)
< triangle (left)
> triangle (right)
p pentagram
h hexagram

Se il colore non è specificato, il comando "plot()" usa un colore non ancora utilizzato.

Se nessun simbolo è specificato, il comando "plot()" non usa alcun simbolo.

Se nessun tipo di linea e nessun simbolo sono specificati, il comando "plot()" usa una linea continua.

Se nessun tipo di linea è specificato ma il simbolo è invece indicato, il comando "plot()" non usa alcun tipo di
linea e disegna solo i simboli.

Per vedere l'utilizzo del comando "plot()" carichiamo a titolo di esempio il file 'RACE.MI.csv' contenente i
prezzi del titolo Ferrari N.V. dal 21 febbraio 2018 al 20 marzo 2018.

1
Race=readtable('RACE.MI.csv');

Warning: Variable names were modified to make them valid MATLAB identifiers. The original names are saved in
the VariableDescriptions property.

Race(1:5,:)

ans = 5×7 table

Date Open High Low Close AdjClose

1 2018-02-21 103.8500 105.7500 103.3500 105.3000 105.3000

2 2018-02-22 104.5000 104.5000 102.4500 103.1000 103.1000

3 2018-02-23 103.1000 104.5500 101.7500 104.5000 104.5000

4 2018-02-26 105.3000 106.7500 104.3000 104.8000 104.8000

5 2018-02-27 105.1000 105.5500 103.7000 104.1000 104.1000

Con l seguenti comandi tracciamo il grafico dei prezzi di chiusura del titolo:

plot(Race.Date,Race.Close); % colore casuale, riga continua, nessun simbolo

plot(Race.Date,Race.Close,'b-*'); % colore blu, riga continua, asterisco

2
plot(Race.Date,Race.Close,'g'); % colore verde, riga continua, nessun simbolo

3
plot(Race.Date,Race.Close,'rs'); % colore rosso, nessuna linea, quadratino

plot(Race.Date,Race.Close,'m--'); % colore magenta, riga tratteggiata, nessun simbolo

4
Tracciare più grafici nello stesso piano cartesiano
Con uno stesso comando “plot()” è possibile anche disegnare più grafici nello stesso piano cartesiano. Ad
esempio, con il seguente comando:

plot(X1,Y1,opt1,X2,Y2,opt2,X3,Y3,opt3); % comando per tracciare tre grafici

si tracciano nella stesso piano cartesiano tre grafici, il primo dato da {X1,Y1,opt1}, il secondo da
{X2,Y2,opt2}, il terzo da {X3,Y3,opt3}. Lo stesso risultato si può ottenere utilizzando i comandi “hold on” (che
indica di continuare a plottare i grafici nello stesso piano cartesiano) e “hold off” (che indica di andare a
plottare i futuri grafici in un nuovo piano cartesiano).

plot(X1,Y1,opt1); % traccia il primo grafico


hold on; % continua a usare lo stesso piano cartesiano
plot(X2,Y2,opt2); % traccia il secondo grafico
plot(X3,Y3,opt3); % traccia il terzo grafico
hold off; % conclude l'uso del piano cartesiano

La possibilità di disegnare più grafici in uno stesso piano cartesiano permette, ad esempio, di tracciare un
grafico non monocolore. Il seguente comando fornisce il grafico dei prezzi di chiusura del titolo, tracciando il
grafico di blu, con punti uniti da riga continua. Con un secondo grafico esattamente sovrastante il precedente
si evidenziano le singole quotazioni con un circoletto rosso.

plot(Race.Date,Race.Close,'b-',Race.Date,Race.Close,'ro');

5
Tracciamo adesso nello stesso piano cartesiano i prezzi di chiusura, quelli di apertura, i prezzi massimi ed i
prezzi minimi.

plot(Race.Date,Race.Close,'b-*'); % blu, riga unita, asterisco


hold on;
plot(Race.Date,Race.Open,'g-d'); % verde, riga unita, diamond
plot(Race.Date,Race.High,'m:'); % magenta, riga punteggiata
plot(Race.Date,Race.Low,'r--'); % rosso, riga tratteggiata
hold off;

6
Lo stesso risultato si ottiene con il seguente comando (molto meno chiaro, si osservi l'uso dei tre punti
consecutivi che permettono di mandare accapo un comando troppo lungo).

plot(Race.Date,Race.Close,'b-*',Race.Date,Race.Open,'g-d',...
Race.Date,Race.High,'m:',Race.Date,Race.Low,'r--');

7
Come aggiungere informazioni al grafico
E’ molto utile aggiungere informazioni alla figura con i seguenti comandi opzionali:

title('Titolo della Figura'); % Titolo Figura


legend('NomeGrafico1','NomeGrafico2','NomeGrafico3'); % Legenda Grafici
xlabel('Descrizione Ascisse'); % Etichetta Ascisse
ylabel('Descrizione Ordinate'); % Etichetta Ordinate
grid on; % Griglia Sottofondo
grid minor; % Griglia Più Fitta

Risulta molto comodo anche il seguente comando (di uso essenziale nel caso in cui si intendano definire o si
siano definite figure con al proprio interno piani cartesiani multipli) che apre una nuova figura e dà un nome
alla finestra contenente la figura:

figure('Name','Titolo Finestra'); % apre nuova figura in "Titolo Finestra"

Spesso, per migliorare la leggibilità della figura, risulta utile evitare che il grafico vada a toccare i bordi esterni
del piano cartesiano. A tal fine si possono utilizzare i seguenti comandi che definiscono a priori gli estremi
delle ascisse e delle ordinate del piano cartesiano. Questi comandi saranno utili in seguito anche nel caso
di figure aventi al proprio interno più piani cartesiani, per fare in modo che i vari plottaggi abbiano stesse
ascisse ed ordinate e possano quindi essere confrontabili l'un l'altro.

xlim([Xleft Xright]); % definisce gli estremi delle ascisse del piano cartesiano

8
ylim([Ydown Yup]); % definisce gli estremi delle ordinate del piano cartesiano

Vediamo come migliora il plottaggio dei prezzi del titolo Ferrari N.V.

figure('Name','Ferrari N.V.');
Xleft=Race.Date(1)-caldays(1);
Xright=Race.Date(end)+caldays(1);
%
plot(Race.Date,Race.Close,'b-*');
hold on;
plot(Race.Date,Race.Open,'g-d');
plot(Race.Date,Race.High,'m:');
plot(Race.Date,Race.Low,'r--');
hold off;
%
xlim([Xleft Xright]);
title('Prezzi Titolo Ferrari N.V.');
legend('Chiusura','Apertura','Massimo','Minimo');
xlabel('Giornate');
ylabel('Quotazioni');
grid on;
grid minor;

Più piani cartesiani in una stessa figura

9
Tramite il comando "subplot()" è possibile creare una figura suddivisa al proprio interno in un array di piani
cartesiani. Ad esempio i seguenti comandi creano una figura composta da due piani cartesiani l'uno sull'altro:

figure('Name','NomeFinestra');
subplot(2,1,1); % 2 righe di p.cart., 1 colonna di p.cart., grafico 1
Lista_Comandi_PrimoPianoCartesiano
subplot(2,1,2); % 2 righe di p.cart., 1 colonna di p.cart., grafico 2
Lista_Comandi_SecondoPianoCartesiano

I seguenti comandi invece creano una figura composta da quattro piani cartesiani in formazione 2x2:

figure('Name','NomeFinestra');
subplot(2,2,1); % 2 righe di p.cart., 2 colonne di p.cart., grafico 1
Lista_Comandi_PrimoPianoCartesiano
subplot(2,2,2); % 2 righe di p.cart., 2 colonne di p.cart., grafico 2
Lista_Comandi_SecondoPianoCartesiano
subplot(2,2,3); % 2 righe di p.cart., 2 colonne di p.cart., grafico 3
Lista_Comandi_TerzoPianoCartesiano
subplot(2,2,4); % 2 righe di p.cart., 2 colonne di p.cart., grafico 4
Lista_Comandi_QuartoPianoCartesiano

Vediamo subito un esempio di utilizzo di questi comandi:

figure('Name','Ferrari 2-Grafici');
Xleft=Race.Date(1)-caldays(1);
Xright=Race.Date(end)+caldays(1);
%
subplot(2,1,1);
plot(Race.Date,Race.Close,'b-*');
hold on;
plot(Race.Date,Race.Open,'g-d');
hold off;
xlim([Xleft Xright]);
title('Prezzi Apertura/Chiusura Titolo Ferrari N.V.');
legend('Chiusura','Apertura');
xlabel('Giornate');
ylabel('Quotazioni');
grid on;
grid minor;
%
subplot(2,1,2);
plot(Race.Date,Race.High,'m-s');
hold on;
plot(Race.Date,Race.Low,'r-o');
hold off;
xlim([Xleft Xright]);
title('Prezzi Massimo/Minimo Titolo Ferrari N.V.');
legend('Massimo','Minimo');
xlabel('Giornate');
ylabel('Quotazioni');
grid on;
grid minor;

10
figure('Name','Ferrari 4-Grafici');
Xleft=Race.Date(1)-caldays(1);
Xright=Race.Date(end)+caldays(1);
%
subplot(2,2,1);
plot(Race.Date,Race.Open,'g-d');
xlim([Xleft Xright]);
title('Prezzi Apertura Titolo Ferrari N.V.');
legend('Apertura');
xlabel('Giornate');
ylabel('Quotazioni');
grid on;
grid minor;
%
subplot(2,2,2);
plot(Race.Date,Race.Close,'b-*');
xlim([Xleft Xright]);
title('Prezzi Chiusura Titolo Ferrari N.V.');
legend('Chiusura');
xlabel('Giornate');
ylabel('Quotazioni');
grid on;
grid minor;
%
subplot(2,2,3);
plot(Race.Date,Race.High,'m-s');
11
xlim([Xleft Xright]);
title('Prezzi Massimi Titolo Ferrari N.V.');
legend('Massimo');
xlabel('Giornate');
ylabel('Quotazioni');
grid on;
grid minor;
%
subplot(2,2,4);
plot(Race.Date,Race.Low,'r-o');
xlim([Xleft Xright]);
title('Prezzi Minimi Titolo Ferrari N.V.');
legend('Minimo');
xlabel('Giornate');
ylabel('Quotazioni');
grid on;
grid minor;

Tracciare assi Cartesiani


In taluni casi è utile tracciare degli assi cartesiani nella figura oggetto del grafico, magari per evidenziare le
intersezioni con gli assi. MATLAB non ha opzioni al riguardo, quindi occorre disegnare gli assi cartesiani per
mezzo di altri comandi “plot()”.

12
Si supponga di voler disegnare i seguenti assi generici, con ascisse da Xmin ad Xmax, ordinate da Ymin ad
Ymax, che si intersecano nel punto (Ox,Oy):

Nel caso in cui le ascisse debbano andare da -2 a 4, le ordinate da -4 a 5, e gli assi si debbano intersecare
nell’origine (Ox,Oy)=(0,0), si possono utilizzare, ad esempio, i seguenti comandi "plot()" per tracciare gli assi
cartesiani di colore blu. Si osservi come sia utile ridimensionare un poco la figura con i comandi "xlim()" ed
"ylim()" per centrare gli assi al suo interno ed evitare che arrivino al bordo.

figure;
xmin=-2; xmax=4; % valori min/max asse ascisse
ymin=-4; ymax=5; % valori min/max asse ordinate
Ox=0; Oy=0; % origine assi cartesiani
%
dx=(xmax-xmin)*0.05; % calcola piccolo bordo per ascisse
dy=(ymax-ymin)*0.05; % calcola piccolo bordo per ordinate
Xleft=xmin-dx; % calcola bordo sinistro del piano cartesiano
Xright=xmax+dx; % calcola bordo destro del piano cartesiano
Ydown=ymin-dy; % calcola bordo inferiore del piano cartesiano
Yup=ymax+dy; % calcola bordo superiore del piano cartesiano
%
plot([xmin,xmax],[Oy,Oy],'b'); % disegna asse ascisse
hold on; % continua a disegnare nella stessa figura
plot([Ox,Ox],[ymin,ymax],'b'); % disegna asse ordinate
hold off; % termina disegno della figura
xlim([Xleft Xright]); % fissa orizzontalmente il piano cartesiano
ylim([Ydown Yup]); % fissa verticalmente il piano cartesiano

13
E’ ovviamente possibile disegnare anche solo alcuni dei quattro quadranti.

Solo primo quadrante (xmin=0, ymin=0):

figure;
xmin=0; xmax=4; % valori min/max asse ascisse
ymin=0; ymax=5; % valori min/max asse ordinate
Ox=0; Oy=0; % origine assi cartesiani
%
dx=(xmax-xmin)*0.05; % calcola piccolo bordo per ascisse
dy=(ymax-ymin)*0.05; % calcola piccolo bordo per ordinate
Xleft=xmin-dx; % calcola bordo sinistro del piano cartesiano
Xright=xmax+dx; % calcola bordo destro del piano cartesiano
Ydown=ymin-dy; % calcola bordo inferiore del piano cartesiano
Yup=ymax+dy; % calcola bordo superiore del piano cartesiano
%
plot([xmin,xmax],[Oy,Oy],'b'); % disegna asse ascisse
hold on; % continua a disegnare nella stessa figura
plot([Ox,Ox],[ymin,ymax],'b'); % disegna asse ordinate
hold off; % termina disegno della figura
xlim([Xleft Xright]); % fissa orizzontalmente il piano cartesiano
ylim([Ydown Yup]); % fissa verticalmente il piano cartesiano

14
Primo e quarto quadrante (xmin=0):

figure;
xmin=0; xmax=4; % valori min/max asse ascisse
ymin=-4; ymax=5; % valori min/max asse ordinate
Ox=0; Oy=0; % origine assi cartesiani
%
dx=(xmax-xmin)*0.05; % calcola piccolo bordo per ascisse
dy=(ymax-ymin)*0.05; % calcola piccolo bordo per ordinate
Xleft=xmin-dx; % calcola bordo sinistro del piano cartesiano
Xright=xmax+dx; % calcola bordo destro del piano cartesiano
Ydown=ymin-dy; % calcola bordo inferiore del piano cartesiano
Yup=ymax+dy; % calcola bordo superiore del piano cartesiano
%
plot([xmin,xmax],[Oy,Oy],'b'); % disegna asse ascisse
hold on; % continua a disegnare nella stessa figura
plot([Ox,Ox],[ymin,ymax],'b'); % disegna asse ordinate
hold off; % termina disegno della figura
xlim([Xleft Xright]); % fissa orizzontalmente il piano cartesiano
ylim([Ydown Yup]); % fissa verticalmente il piano cartesiano

15
Primo e secondo quadrante (ymin=0):

figure;
xmin=-2; xmax=4; % valori min/max asse ascisse
ymin=0; ymax=5; % valori min/max asse ordinate
Ox=0; Oy=0; % origine assi cartesiani
%
dx=(xmax-xmin)*0.05; % calcola piccolo bordo per ascisse
dy=(ymax-ymin)*0.05; % calcola piccolo bordo per ordinate
Xleft=xmin-dx; % calcola bordo sinistro del piano cartesiano
Xright=xmax+dx; % calcola bordo destro del piano cartesiano
Ydown=ymin-dy; % calcola bordo inferiore del piano cartesiano
Yup=ymax+dy; % calcola bordo superiore del piano cartesiano
%
plot([xmin,xmax],[Oy,Oy],'b'); % disegna asse ascisse
hold on; % continua a disegnare nella stessa figura
plot([Ox,Ox],[ymin,ymax],'b'); % disegna asse ordinate
hold off; % termina disegno della figura
xlim([Xleft Xright]); % fissa orizzontalmente il piano cartesiano
ylim([Ydown Yup]); % fissa verticalmente il piano cartesiano

16
A titolo di esempio, vediamo come tracciare il grafico della funzione nell’intervallo [-2,4]
evidenziandone le intersezioni con le ascisse in ed .

f=@(x) x.^2-2*x-3; % definizione della funzione


X=-2:0.2:4; % ascisse dei punti
Y=f(X); % ordinate dei punti
%
figure; % apre la nuova figura;
xmin=-2; xmax=4; % valori min/max asse ascisse
ymin=-4; ymax=5; % valori min/max asse ordinate
Ox=0; Oy=0; % origine assi cartesiani
%
dx=(xmax-xmin)*0.05; % calcola piccolo bordo per ascisse
dy=(ymax-ymin)*0.05; % calcola piccolo bordo per ordinate
Xleft=xmin-dx; % calcola bordo sinistro del piano cartesiano
Xright=xmax+dx; % calcola bordo destro del piano cartesiano
Ydown=ymin-dy; % calcola bordo inferiore del piano cartesiano
Yup=ymax+dy; % calcola bordo superiore del piano cartesiano
%
plot(X,Y,'r-'); % traccia il grafico
hold on; % continua a disegnare nella stessa figura
plot([xmin,xmax],[Oy,Oy],'b'); % disegna asse ascisse
plot([Ox,Ox],[ymin,ymax],'b'); % disegna asse ordinate
Ax=-1; Ay=0; % punto A intersezione con ascisse
Bx=3; By=0; % punto B intersezione con ascisse

17
plot(Ax,Ay,'ks'); % disegna punto A
plot(Bx,By,'ks'); % disegna punto B
hold off; % termina disegno della figura
%
xlim([Xleft Xright]); % fissa orizzontalmente il piano cartesiano
ylim([Ydown Yup]); % fissa verticalmente il piano cartesiano
title('Esempio di grafico con assi cartesiani'); % titolo figura
legend('Grafico di x^2-2x-3'); % legenda grafici
xlabel('Ascisse'); % etichetta asse ascisse
ylabel('Ordinate'); % etichetta asse ordinate
grid on; % griglia di sottofondo
grid minor; % griglia più fitta

18

Potrebbero piacerti anche