2012-11-27 3 views
13

Ich zeichne einige Daten mit einem anderen X-Bereich und ich würde gerne Yrange nach dem maximalen und minimalen Wert der Daten im aktuellen X-Bereich ändern. Wenn ich GPVAL_Y_MAX und GPVAL_Y_MIN verwende, entsprechen diese Werte dem Maximum und Minimum der gesamten Daten, nicht nur den Daten im Bereich.gnuplot: Max- und Min-Werte in einem Bereich

Zum Beispiel habe ich die folgenden Daten:

1 3 
2 5 
3 8 
4 20 
5 30 

ich das folgende Skript verwenden:

plot 'data.txt' u 1:2; 
set xrange [1:3]; 
replot 
set xrange [1:5]; 
replot 

Im ersten Plot würde Ich mag yrange setzen in [3: 8], aber in der zweiten Handlung ist der Yrange Sholud [3:30]. Wenn ich so etwas wie

set yrange [GPVAL_Y_MIN:GPVAL_Y_MAX] 

GPVAL_Y_MIN und GPVAL_Y_MAX hat den gleichen Wert unabhängig von den xrange verwenden.

Irgendeine Lösung?

+0

Ich würde verwenden nur 'set yrange [* *]' erreicht die gleicher Effekt. – SDsolar

Antwort

10

Die Variablen Sie sind GPVAL_DATA_Y_MIN und GPVAL_DATA_Y_MAX, die die y-min/max der Daten in einem bestimmten Bereich aufgetragen sind. GPVAL_Y_MIN und GPVAL_Y_MAX sind im Allgemeinen ein wenig weniger nützlich, weil sie Ihnen sagen, wo die Ränder des Plot-Rahmens liegen (im Allgemeinen gehen diese Werte ein wenig über die GPVAL_DATA... Variablen hinaus, da gnuplot ein wenig Abstand zwischen den Daten und dem Rand des Plots lässt).

Um die Vorteile dieser Variablen nehmen Sie die Bereichsbezeich zum Plotbefehl verwenden:

plot [1:3] 'data.txt' 
set yr [GPVAL_DATA_Y_MIN:GPVAL_DATA_Y_MAX] 
replot 
... 

By the way, die u 1:2 Spezifikation ist überflüssig, wenn Sie sich selbst davon erinnern wollen Spalten Sie Plotten , da die ersten beiden Spalten als x und y dargestellt werden, ist der Gnuplot-Standardwert. Wenn Sie nicht auf den gleichen Ausgangsanschluss neu zu zeichnen möchten (was in einigen Terminals wie eps nicht hilfreich ist, wo replotting eine zweite Seite mit dem gleichen Grundstück macht), diese Befehlsfolge:

set terminal unknown 
plot [1:3] 'data.txt' 
set terminal <actual output terminal here> 
set output 'output.trm' 
plot [1:3][GPVAL_DATA_Y_MIN:GPVAL_DATA_Y_MAX] 'data.txt' 

Beachten Sie die Verwendung des Bereichsspezifizierers erneut, diesmal mit einem bestimmten Bereich. Dies ist ein wenig kompakter als die Angabe mit set yrange, sorgt aber für eine längere Codezeile.

Wenn Sie gnuplot 4.6.0 oder höher haben, können Sie den Befehl stats nutzen, um ein erneutes Auftreten zu vermeiden. Der stats Befehl erzeugt eine Reihe von Variablen handlichen

stats [1:3] 'data.txt' 
plot [1:3][stats_min_y:stats_max_y] 'data.txt' 

Eines etwas anderen Befehl,

stats [1:3] 'data.txt' 
plot [stats_min_x:stats_max_x][stats_min_y:stats_max_y] 'data.txt' 

Würde die Handlung in der x-Richtung auf, wo die aktuellen Daten liegen füllen. Wenn Sie beispielsweise Datenpunkte bei {(1.1, 3), (2, 4), (2.9, 5)} hätten, wäre der x-Bereich auf [1.1: 2.9] eingestellt.

+0

Vielen Dank! – josematamoros

+1

Nur um abzuschließen: 'GPVAL_DATA _...' sind undokumentiert (in 4.6, Standard-Release in Ubuntu 14.04), aber sie sind vorhanden, sie sind ** nur ** nach dem ersten Datenplot gefüllt. – kebs

+1

Mit Gnuplot 5.0.6 (und möglicherweise vor dieser Version) ist es nicht mehr "stats_max_y", sondern 'STATS_max_y' (und der entsprechende Variablenname ändert sich). – kartoffelsalat

2

Setzen des Yrange auf GPVAL_DATA_Y_MIN: GPVAL_DATA_Y_MAX hat den Nachteil, dass keine gnuplots-Autoscaling-Funktionalität verwendet wird, die die Bereiche auf den nächsten Tick erweitert.

Im automatischen Plotten ziehe ich daher die folgenden

f(x)=sin(x)>0.5? 1:-1 #example function 

set ytics 0.2 
plot 1.01*f(x) # dummy plot to set GPVAL_* 
set yrange [GPVAL_Y_MIN:GPVAL_Y_MAX] 

plot f(x) # actual plot 

Dies funktioniert auch für Diagramme natürlich:

plot 'data.csv' u 1:(1.01*$2) 
set yrange [GPVAL_Y_MIN:GPVAL_Y_MAX] 
plot 'data.csv' u 1:2