2012-10-05 11 views
9

Muszę narysować funkcję na układzie współrzędnych, która ma swój początek w środku ekranu (lub gdzieś w pobliżu środka, ale niekoniecznie w środku) i muszę narysować osie tak, aby krzyżowały się w punkcie początkowym. Osie powinny również mieć etykiety i tiki oraz strzałki.jak przenieść osie na środek wykresu?

Nie mam pojęcia, jak to zrobić skutecznie, do tej pory w moim kodzie ręcznie ustawiłem przesunięcia dla moich tików i narysowałem strzałki ręcznie używając również przesunięć. Ustawiam również przesunięcia na etykietach osi. Wszystko to jest bardzo delikatne, a przesunięcia zmieniają się w zależności od ustawień terminala.

Czy ktoś mógłby mi pomóc z przykładowym kodem lub wyjaśnieniem, jak to zrobić we właściwy sposób?

Odpowiedz

10

Cóż, użycie _zeroaxis jest "właściwą" drogą, aby uzyskać tiki i etykiety: ustawienie _range daje symetrię, aby uczynić centrum 0,0 ... a gdy już poznasz _range, możesz narysować strzałki włączone ręcznie.

set xzeroaxis 
set xtics axis 
set xrange [-10:10] 
set arrow 1 from -9,0 to -10,0 
set arrow 2 from 9,0 to 10,0 

set yzeroaxis 
set ytics axis 
set yrange [-1:1] 
set arrow 3 from 0,-.9 to 0,-1 
set arrow 4 from 0,.9 to 0,1 

set border 0 

plot sin(x) 

enter image description here

+2

+1. 'set zeroaxis' wydaje się, że obie osie przechodzą przez początek w jednym poleceniu. Możesz również określić grubość i typ linii dla osi: 'set zeroaxis linewidth 2 rodzaj 1', itp. – Umang

+0

Możesz najpierw" wyłączyć x2tics "i" unset y2tics ". W przeciwnym razie wszystkie tiki zostaną wyświetlone dwukrotnie. – d3dave

3

Atak hack!

set term pngcairo truecolor size 300,300 font "Arial,12" 
set out 'plot.png' 

# x,y min/max and center 
xmin = -10 
xc = 0 
xmax = 10 
ymin = -2 
yc = 0 
ymax = 2 
# default borders 
tm = 1 
bm = 1 
rm = 4 
lm = 4 
# arrow scale factor to cover last tic 
af = 1.05 
set arrow from xc,yc to xmin*af,yc filled size 0.6,30 
set arrow from xc,yc to xmax*af,yc filled size 0.6,30 
set arrow from xc,yc to xc,ymax*af filled size 0.6,30 
set arrow from xc,yc to xc,ymin*af filled size 0.6,30 

set multiplot layout 2,2 
## Plot 1, top left 
set key top left 
set xr [xmin:xc] 
set yr [yc:ymax] 
set tmargin tm 
set bmargin 0 
set rmargin 0 
set lmargin lm 
set border 9 
unset ytics 
set xtics nomirror 
plot sin(x) 
## Plot 2, top right 
unset key 
set xr [xc:xmax] 
set lmargin 0 
set rmargin rm 
set border 3 
set ytics nomirror 
replot 
## Plot 3, bottom left 
set xr [xmin:xc] 
set yr [ymin:yc] 
set bmargin bm 
set tmargin 0 
set lmargin lm 
set rmargin 0 
set border 12 
unset tics 
replot 
## Plot 4, bottom right 
set xr [xc:xmax] 
set lmargin 0 
set rmargin rm 
set border 6 
set ytics nomirror 
replot 
unset multiplot 

uzyskać ten wynik: enter image description here

Powiedział, że można zajrzeć do opcji zeroaxis. Jest demonstracja here. Niestety ta opcja nie rysuje osi na zero, ale po prostu umieszcza linię w tej pozycji.

Nie powiedziałbym, że moja metoda jest "wydajna", ale prawdopodobnie nie ma zbyt dużego wysiłku, aby zmodyfikować to do swoich celów, oprócz zmiany funkcji/danych wykreślanych, ponieważ większość pracy jest wykonywana przez polecenia replot. Nie znam opcji, aby zrobić gnuplot umieścić strzałki na końcu osi lub zmienić, gdzie osie są rysowane natywnie.

+0

+1 dla "Hack Attack!" (i ładnie wyglądająca fabuła) – mgilson

1

Oprócz odpowiedzi Jima, gdyby wymagała tiki i osie mogą być doprowadzone do przedniej

# bring the grid over the plot 
set grid front 

# remove grid if not required 
unset grid