2012-10-05 9 views
9

Ich muss eine Funktion auf ein Koordinatensystem zeichnen, das seinen Ursprung in der Mitte des Bildschirms (oder irgendwo in der Mitte, aber nicht unbedingt in der Mitte) und ich muss Achsen zeichnen, so dass sie im Ursprung kreuzen. Achsen sollten auch Etiketten und Tics sowie Pfeile enthalten.wie Achsen in die Mitte des Diagramms verschoben werden?

Ich habe keine Ahnung, wie man das effizient macht, bisher habe ich in meinem Code manuell Offsets für meine Tics eingestellt und zeichne Pfeile auch manuell mit Offsets. Ich setze auch Offsets für die Achsenbeschriftungen. All dies ist sehr zerbrechlich, und die Offsets ändern sich je nach den Terminaleinstellungen.

Würde mir bitte jemand mit einem Beispielcode oder einer Erklärung helfen, wie man das richtig macht?

Antwort

10

Nun, mit _zeroaxis ist der "richtige" Weg zu gehen, um die Tics und Labels zu bekommen: Setzen Sie den _range gibt Ihnen die Symmetrie um 0,0 Zentrum zu machen ... und sobald Sie den _range kennen, können Sie zeichnen Pfeile auf manuell.

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' scheint zu bewirken, dass beide Achsen in einem Befehl durch den Ursprung gehen. Sie können auch die gewünschte Dicke und den gewünschten Linientyp für die Achse angeben: 'set zeroaxis linewidth 2 linetype 1', usw. – Umang

+0

Sie können zuerst 'x2tics' und 'ysetts unset' löschen. Ansonsten erhältst du alle Tics zweimal angezeigt. – d3dave

3

Hack Angriff!

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 

ich diese Ausgabe: enter image description here

Das heißt, könnten Sie die zeroaxis Option suchen. Es gibt eine Demonstration here. Leider zeichnet diese Option die Achse nicht auf Null, sondern setzt nur eine Linie auf diese Position.

Ich würde nicht sagen meine Methode ist "effizient", aber es gibt wahrscheinlich nicht zu viel Aufwand, um dies für Ihre Zwecke zu ändern abgesehen von der Funktion/Daten zu ändern, da die meiste Arbeit von replot Befehle ausgeführt wird. Ich kenne keine Option, um gnuplot Pfeile am Achsenende zu setzen oder zu ändern, wo die Achsen nativ gezeichnet werden.

+0

+1 für gebracht werden "Hack Attack!" (und eine schön aussehende Handlung) – mgilson

1

Neben Jims Antwort bei Bedarf die Tics und Achsen nach vorne

# bring the grid over the plot 
set grid front 

# remove grid if not required 
unset grid 
Verwandte Themen