—————
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
1
Grafici bidimensionali in MATLAB
(Live Script realizzato con MATLAB versione 2018a)
dove:
- 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.
Se il colore non è specificato, il comando "plot()" usa un colore non ancora utilizzato.
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,:)
Con l seguenti comandi tracciamo il grafico dei prezzi di chiusura del titolo:
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
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:
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).
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.
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:
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:
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;
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
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;
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.
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 .
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