2012-06-29 4 views
9

Comment est-ce que je peux limiter l'autoscaling de gnuplot, de sorte que, par exemple pour le y-max, il est au moins une certaine valeur et il établirait automatiquement la limite? En regardant la documentation, je vois seulement comment fixer min-, ou max- fin de l'axe, tandis que l'autre est automatiquement mis à l'échelle.Gnuplot limites minimum et maximum pour l'autoscaling

About autoscaling on PDF page 93

+0

Pourriez-vous préciser ce que vous entendez par autoscaling? Voulez-vous définir le ymax à une certaine valeur, ou voulez-vous mettre à l'échelle les données afin que leur maximum ait une certaine valeur? – andyras

+0

@andyras Exemple pour ymax: le minimum (du ymax) pourrait être de 100 et maximum de 1000. Si le point de données le plus élevé est 50, le ymax serait de 100. Il serait automatiquement mis à l'échelle pour des valeurs jusqu'à 1000. serait coupé. – varesa

Répondre

18

Depuis la version 4.6, gnuplot propose une nouvelle syntaxe pour spécifier les limites supérieure et inférieure de l'autoscaling. Pour votre cas, vous pouvez utiliser

set xrange [0:100 < * < 1000] 

Je cite la documentation:

La plage dans laquelle autoscaling est en cours d'exécution peut être limitée par une borne <lb> ou une borne inférieure supérieure <ub> ou les deux. La syntaxe est

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

Par exemple

0 < * < 200 

ensembles <lb> = 0 et <ub> = 200.

Cette syntaxe peut être appliquée à la fois à la valeur minimale ou maximale set *range.

Pour xmin mais en gardant l'échelle automatique, il positif, utilisez

set xrange [0<*:] 

Pour x mais garder l'échelle automatique portée minimale de 10 à 50:

set xrange [*<10:50<*] 

Voir la documentation sur set xrange pour plus d'informations.

4

Je ne pense pas qu'il est possible, que ce soit vous avez autoscaling sur no-, ou min- max-, ou les deux axes i.e. .:

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

Respectivement.

+0

Donc, il semble que c'était vraiment comme ça, plutôt que je ne pouvais pas le trouver. Semble que je dois mettre à l'échelle manuellement en utilisant les données – varesa

4

Dans ce cas, vous pouvez filtrer les données et laisser gnuplot faire son auto-mise à l'échelle normale:

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

C'est à peu près ce que j'ai fait (, mais en dehors de gnuplot). Désolé si j'ai mal lu le code, mais cela laisse toute valeur en dessous de YMIN? Vous pourriez avoir légèrement mal interprété ce que je voulais (par exemple Ymin = 0, Ymax = 100-1000). J'ai résolu cela en ajoutant un seul point de données, avec la couleur d'arrière-plan (donc invisible) à YMIN. Cela m'a donné l'effet que je voulais. – varesa

+1

@varesa - Si vous utilisez gnuplot 4.6, il y a aussi la commande 'stats' dans laquelle vous pouvez coupler le filtre ci-dessus et les variables gnuplot-définies:' GPVAL_YMIN' et 'GPVAL_XMIN', mais maintenant nous commençons à devenir un peu plus compliqué. le point "invisible" est cependant une idée intéressante - j'aime ça. – mgilson

+0

@mgilson Gnuplot 4.6 a ajouté même une nouvelle syntaxe pour de telles limites supérieures et inférieures dans l'autoscaling, comme 'set xrange [0: 100 <* <1000]'. – Christoph

1

Puisque les gens semblent être intéressés par cette question, je vais ajouter la façon dont je résolu ce problème comme une réponse:

J'ai fait le minimum pour l'autoscaling en insérant un marqueur invisible au début des données. Cela fait que l'intrigue le «montre» toujours, même s'il ne peut pas être vu.

Ensuite, je mis en œuvre le maximum en dehors de gnuplot (pourrait propably été possible à l'intérieur aussi bien, jetez un oeil à la réponse de mgilson), dans un script d'analyseur que je l'ai utilisé pour préparer les données pour gnuplot.

En fait, dans le script j'ai pris toutes les valeurs "écrêtées", les ai ajoutées à y = 0, et les ai rendues rouges. De cette façon, je reçois un «avertissement», des valeurs étant trop grandes pour être sensible au graphique. (Mon programme surveille les pings entre deux hôtes, et il n'y a aucun sens à essayer de graphiquement 5s + latences => Je le marque comme brisé)

Questions connexes