2012-06-29 11 views
9

Wie kann ich die automatische Skalierung von gnuplot begrenzen, so dass, als Beispiel für die y-max, es mindestens einen bestimmten Wert ist und es bis zu festen "Grenze" autoskalieren würde?Gnuplot minimale und maximale Grenzen für Autoscaling

Aus der Dokumentation, sehe ich nur, wie min-oder max-Ende der Achse zu beheben, während die andere automatisch skaliert wird.

About autoscaling on PDF page 93

+0

Können Sie klarstellen, was Sie mit Autoscaling meinen? Möchten Sie Ymax auf einen bestimmten Wert setzen oder möchten Sie die Daten so skalieren, dass ihr Maximum einen bestimmten Wert hat? – andyras

+0

@andyras Beispiel für ymax: Das Minimum (des ymax) könnte 100 und maximal 1000 sein. Wenn der höchste Datenpunkt 50 ist, wäre das ymax 100. Es würde automatisch für Werte bis 1000 skalieren. Danach die Werte würde ausgeschnitten werden. – varesa

Antwort

18

Seit Version 4.6 gnuplot bietet eine neue Syntax zum Festlegen der oberen und unteren Grenzen für die Autoscaling. Für Ihren Fall könnten Sie

set xrange [0:100 < * < 1000] 

Zitiert aus der Dokumentation verwenden:

Der Bereich, in dem die automatische Skalierung durchgeführt wird durch eine untere Schranke <lb> oder eine obere Schranke <ub> oder beides begrenzt werden. Die Syntax ist

{ <lb> < } * { < <ub> } 

Zum Beispiel

0 < * < 200 

Sätze <lb> = 0 und <ub> = 200.

Diese Syntax kann auf den minimalen oder maximalen Wert von set *range angewendet werden.

Automatische Skalierung xmin aber es positiv zu halten,

set xrange [0<*:] 

verwenden x Automatische Skalierung aber minimale Reichweite von 10 bis 50 halten:

set xrange [*<10:50<*] 

Lesen Sie die Dokumentation über set xrange für weitere Informationen.

4

Ich glaube nicht, es möglich ist, müssen Sie entweder die automatische Skalierung auf no-, Min- oder Max- oder beide Achsen d.h .:

set yrange [FIXED_MIN : FIXED_MAX] 
set yrange [  * : FIXED_MAX] 
set yrange [FIXED_MIN :   *] 
set yrange [  * :   ] 

Beziehungsweise.

+0

So scheint es wirklich so zu sein, eher, dass ich es nicht finden kann. Anscheinend muss ich manuell mit den Daten skalieren – varesa

4

In diesem Fall könnten Sie die Daten filtern und lassen Sie gnuplot es tun normale Auto-Skalierung:

set yrange [*:*] 
plot 'mydatafile' u 1:(($2 >= YMIN && $2 <= YMAX) ? $2 : 1/0) 
+0

Das ist ziemlich viel, was ich getan habe (, aber außerhalb von gnuplot). Tut mir leid, wenn ich den Code falsch gelesen habe, aber das lässt jeden Wert unter YMIN aus? Sie haben vielleicht etwas falsch interpretiert, was ich wollte (zB Ymin = 0, Ymax = 100-1000). Ich löste das, indem ich bei YMIN einen einzelnen Datenpunkt mit der Hintergrundfarbe (also unsichtbar) hinzufügte. Das gab mir die Wirkung, die ich wollte. – varesa

+1

@varesa - Wenn Sie mit gnuplot 4.6, gibt es auch den 'stats' Befehl, die Sie die obigen Filter und die gnuplot definierten Variablen paaren könnten:' GPVAL_YMIN' und 'GPVAL_XMIN', aber jetzt starten wir zu etwas komplizierter werden. der "unsichtbare" Punkt ist jedoch eine interessante Idee - ich mag es. – mgilson

+0

@mgilson Gnuplot 4.6 fügte sogar eine neue Syntax für solche oberen und unteren Grenzen bei Autoscaling hinzu, wie 'set xrange [0: 100 <* <1000]'. – Christoph

1

Da die Menschen in dieser Frage interessiert zu sein scheinen, ich werde den Weg füge ich diese gelöst eine Antwort:

Ich habe das Minimum für die Autoscaling durch Einfügen einer unsichtbaren Markierung am Anfang der Daten gemacht. Das bewirkt, dass die Handlung es immer "zeigt", obwohl es nicht gesehen werden kann.

Dann implementiert ich die maximale außerhalb von gnuplot (propably möglich, auch im Innern gewesen sein, einen Blick auf mgilson Antwort), in einem Parser-Skript, das ich verwendet habe, um die Daten für gnuplot vorzubereiten.

Eigentlich im Skript habe ich alle "abgeschnitten" -Werte, fügte sie zu y = 0, und machte sie rot. Auf diese Weise bekomme ich eine "Warnung" von Werten, die zu groß sind, um graphisch sinnvoll zu sein. (Mein Programm überwacht Pings zwischen zwei Hosts, und es hat keinen Sinn, 5s + Latenzen zu zeichnen => Ich markiere es als Verbindung unterbrochen)