2013-06-11 2 views
8

voglio tracciare qualcosa di simile:Come ottenere le frecce sugli assi nel grafico MATLAB?

x = 0:0.01:10; 
f = @(x) 50* 1.6.^(-x-5); 
g = @(x) 50* 1.6.^(+x-10); 
plot(x, f(x)); 
hold on 
plot(x, g(x)); 

non riesco a ottenere assi simili a quelli di questa figura:

enter image description here

so di poter rimuovere la parte superiore e linee rette come in this question, ma non so come ottenere le frecce sui bordi.

Non ho bisogno delle annotazioni aggiuntive, ma vorrei rimuovere le tacche sugli assi. So come farlo quando gli assi sono "normali", ma non sono sicuro che debba essere fatto in un altro modo quando gli assi sono già manipolati.

Qualcuno sa come fare?

+4

Solo un avvertimento: MATLAB non è lo strumento giusto per questo tipo di lavoro . Questo tipo di figura è (e dovrebbe essere solo) una sorta di ordine di grandezza, per cui inkscape, MS paint, GIMP o simili dovrebbero essere ampiamente sufficienti. Sebbene sia * possibile * farlo in MATLAB, sii pronto a vedere un codice piuttosto lungo e brutto che non fa altro che provare a ridurre i dettagli dei metodi di trama intrinsecamente molto più dettagliati che MATLAB usa di default. –

risposta

12

Beh, non dire che non ti avevo avvertito :)

% Some bogus functions 
f = @(x) 50* 1.6.^(-x-5); 
g = @(x) 50* 1.6.^(+x-10); 

% Point where they meet 
xE = 2.5; 
yE = f(xE); 

% Plot the bogus functions 
figure(1), clf, hold on 
x = 0:0.2:5; 
plot(x,f(x),'r', x,g(x),'b', 'linewidth', 2) 

% get rid of standard axes decorations 
set(gca, 'Xtick', [], 'Ytick', [], 'box', 'off') 

% Fix the axes sizes 
axis([0 5 0 5]) 

% the equilibrium point 
plot(xE, yE, 'k.', 'markersize', 20) 

% the dashed lines 
line([xE 0; xE xE], [0 yE; yE yE], 'linestyle', '--', 'color', 'k') 

% the arrows 
xO = 0.2; 
yO = 0.1; 
patch(... 
    [5-xO -yO; 5-xO +yO; 5.0 0.0], ... 
    [yO 5-xO; -yO 5-xO; 0 5], 'k', 'clipping', 'off') 

% the squishy wiggly line pointing to the "equilibrium" text 
h = @(x)0.5*(x+0.2) + 0.1*sin((x+0.2)*14); 
x = 2.7:0.01:3.5; 
plot(x, h(x), 'k', 'linewidth', 2) 

% the static texts 
text(xE-yO, -0.2, 'Q^*', 'fontweight', 'bold') 
text(-2*yO, yE, 'P^*', 'fontweight', 'bold') 
text(-2*yO, 4, 'Price', 'rotation', 90, 'fontsize', 14) 
text( 4, -0.2, 'Quantity', 'fontsize', 14) 
text( .5, 4.2, 'Demand', 'fontsize', 14, 'rotation', -55) 
text( 4.0, 3.3, 'Supply', 'fontsize', 14, 'rotation', +55) 
text( 3.6, 2.1, 'Equilibrium', 'fontsize', 14) 

Risultato:

enter image description here

+2

Un grande +1, che mi ha solo fatto sorridere: P Sono impressionato (anche se non sorpreso, dopo aver visto il tuo grafico xkcd). Grazie! –

5

La casella degli strumenti simbolici di matematica ha provisions for making these arrows, ma senza quella casella degli strumenti si è bloccati con il disegno delle frecce. Il seguente codice dovrebbe essere utile per questo scopo:

% determine position of the axes 
axp = get(gca,'Position'); 

% determine startpoint and endpoint for the arrows 
xs=axp(1); 
xe=axp(1)+axp(3)+0.04; 
ys=axp(2); 
ye=axp(2)+axp(4)+0.05; 

% make the arrows 
annotation('arrow', [xs xe],[ys ys]); 
annotation('arrow', [xs xs],[ys ye]); 

% remove old box and axes 
box off 
set(gca,'YTick',[]) 
set(gca,'XTick',[]) 
set(gca,'YColor',get(gca,'Color')) 
set(gca,'XColor',get(gca,'Color')) 

L'unico inconveniente è che per taglie qualche finestra figura si avrà un bordo bianco 1-pixel sotto le frecce, e impostando la proprietà LineWidth degli assi di un un piccolo valore ridicolo non aiuta.

Ma per la stampa, il bordo bianco piccolo non dovrebbe essere rilevante.

+0

+1, funziona come un fascino! Grazie Martin! =) –