2012-06-29 11 views
9

Jak mogę ograniczyć autoskalowanie gnuplot, tak aby jako przykład dla y-max była to przynajmniej pewna wartość, a autoskalowanie miałoby się do ustalonego "limitu"?Granice minimum i maksimum Gnuplot dla autoskalowania

Patrząc na dokumentację, widzę tylko, jak naprawić min- lub max-koniec osi, podczas gdy druga jest skalowana automatycznie.

About autoscaling on PDF page 93

+0

Czy możesz wyjaśnić, co masz na myśli przez autoskalowanie? Czy chcesz ustawić wartość ymax na pewną wartość, czy chcesz przeskalować dane tak, aby ich maksimum miało pewną wartość? – andyras

+0

@andyras Przykład dla ymax: minimalna (z ymax) może wynosić 100, a maksymalna 1000. Jeśli najwyższym punktem danych jest 50, ymax będzie miał 100. Byłby skalowany automatycznie dla wartości do 1000. Następnie wartości byłby wycięty. – varesa

Odpowiedz

18

Od wersji 4.6 gnuplot oferuje nową składnię do określania górnych i dolnych limitów automatycznego skalowania. W Twoim przypadku można użyć

set xrange [0:100 < * < 1000] 

Cytując z dokumentacji:

zakresie, w którym autoskalowanie jest wykonywana może być ograniczona przez dolną granicę <lb> lub górną granicę <ub> lub oba. Składni

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

Przykładowo

0 < * < 200 

zestawy <lb> = 0 i <ub> = 200.

Ta składnia może być zastosowana do minimalnej lub maksymalnej wartości set *range.

Aby AUTOSCALE xmin ale utrzymanie go dodatni, należy

set xrange [0<*:] 

Aby AUTOSCALE x jednak zachować minimalny zakres 10 do 50:

set xrange [*<10:50<*] 

Zobacz dokumentację o set xrange aby uzyskać więcej informacji.

4

Nie sądzę, że jest to możliwe, albo masz AutoScaling na no-, min- lub max-lub obu osi tj .:

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

Odpowiednio.

+0

Wygląda na to, że tak było, a raczej, że nie mogłem go znaleźć. Wydaje się, że muszę skalować ręcznie przy użyciu danych – varesa

4

W tym przypadku, można filtrować dane i niech gnuplot zrobić to normalne automatycznego skalowania:

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

To jest prawie to, co zrobiłem (ale poza gnuplotem). Przepraszam, jeśli przeczytałem kod źle, ale to pomija każdą wartość poniżej YMIN? Być może źle zinterpretowałeś to, czego chciałem (np. Ymin = 0, Ymax = 100-1000). Rozwiązałem to, dodając pojedynczy punkt danych, z kolorem tła (tak, że jest niewidoczny) w YMIN. To dało mi taki efekt, jaki chciałem. – varesa

+1

@varesa - Jeśli używasz gnuplot 4.6, istnieje również polecenie 'stats', które można sparować z powyższym filtrem i zmiennymi zdefiniowanymi przez gnuplot:' GPVAL_YMIN' i 'GPVAL_XMIN', ale teraz zaczynamy trochę bardziej skomplikowane. "niewidzialny" punkt jest jednak ciekawy - lubię to. – mgilson

+0

@mgilson Gnuplot 4.6 dodał nawet nową składnię dla takich górnych i dolnych limitów w autoskalowaniu, takich jak 'set xrange [0: 100 <* <1000]'. – Christoph

1

Ponieważ ludzie wydają się być zainteresowany w tej kwestii, dodam tak, jak rozwiązać ten jako Odpowiedź:

Zrobiłem minimum dla autoskalowania, wstawiając niewidoczny znacznik na początku danych. To powoduje, że fabuła zawsze "pokazuje" to, chociaż nie można go zobaczyć.

Potem realizowane maksimum poza gnuplot (propably mogło być możliwe wewnątrz niej, jak dobrze przyjrzeć mgilson za odpowiedź), w skrypcie parsera że użyłem do przygotowania danych dla gnuplot.

Właściwie w skrypcie wziąłem wszystkie "przycięte" wartości, dodałem je do y = 0 i zrobiłem je czerwone. W ten sposób otrzymuję "ostrzeżenie" o wartościach, które są zbyt duże, aby można je było zastosować do wykresu. (Mój program monitoruje pingi między dwoma hostami i nie ma sensu próbować wykreślić 5s + opóźnienia => oznaczam to jako przerwane połączenie)