2013-06-11 17 views
8

Chcę wykreślić coś takiego:Jak uzyskać strzałki na osiach w działce 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)); 

nie uda się uzyskać osie podobnych do tych na tym rysunku:

enter image description here

wiem, że mogę zdjąć górną i prawe linie jak w this question, ale nie wiem, jak uzyskać strzałki na krawędziach.

Nie potrzebuję dodatkowych adnotacji, ale chciałbym usunąć zaznaczenia na osiach. Wiem, jak to zrobić, gdy osie są "normalne", ale nie jestem pewien, czy trzeba to zrobić w inny sposób, gdy osie są już zmanipulowane.

Czy ktoś wie, jak to zrobić?

+4

Tylko uwaga: MATLAB nie jest odpowiednim narzędziem do tego typu pracy . Ten rodzaj figury jest (i powinien być tylko) czymś podobnym do wielkości magicznej, dla której inkscape, MS paint, GIMP lub podobne powinny wystarczyć. Chociaż jest to * możliwe * zrobienie tego w MATLAB-u, przygotuj się na dość długi i brzydki kod, który nie ogranicza się do próbowania i zmniejszenia szczegółów z natury bardziej szczegółowych metod plotowania, których MATLAB używa domyślnie. –

Odpowiedz

12

No, nie mów, że nie ostrzegałem ciebie :)

% 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) 

Wynik:

enter image description here

+2

Duży +1, który właśnie wywołuje uśmiech na mojej twarzy: P Jestem pod wrażeniem (chociaż nie jestem zaskoczony, widząc twój xkcd-wykres). Dzięki! –

5

Symboliczny zestaw narzędzi matematycznych ma provisions for making these arrows, ale bez tego zestawu narzędzi utkniesz, rysując samymi strzałami. Poniższy kod powinien być przydatne do tego celu:

% 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')) 

Jedyną wadą jest to, że dla niektórych okno postać rozmiary trzeba będzie 1-pikselowego białą obwódkę poniżej strzałek i ustawiając właściwość linewidth osiach Do śmieszna mała wartość nie pomaga.

Jednak do drukowania mała biała ramka nie powinna mieć znaczenia.

+0

+1, działa jak urok! Dzięki Martin! =) –

Powiązane problemy