web-dev-qa-db-fra.com

gnuplot: valeurs max et min dans une plage

Je trace des données avec une plage X différente et je voudrais modifier la plage y en fonction de la valeur maximale et minimale des données dans la plage X actuelle. Lorsque j'utilise GPVAL_Y_MAX et GPVAL_Y_MIN, ces valeurs correspondent au maximum et au minimum de l'ensemble des données, pas seulement les données de la plage.

Par exemple, j'ai les données suivantes:

1 3
2 5
3 8
4 20
5 30

J'utilise le script suivant:

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

Dans la première intrigue, je voudrais définir yrange dans [3: 8], mais dans la deuxième intrigue, le yrange sholud soit [3:30]. Si j'utilise quelque chose comme

set yrange [GPVAL_Y_MIN:GPVAL_Y_MAX]

GPVAL_Y_MIN et GPVAL_Y_MAX ont la même valeur indépendamment de la plage x.

Toute solution?

17
josematamoros

Les variables que vous souhaitez sont GPVAL_DATA_Y_MIN et GPVAL_DATA_Y_MAX, qui sont les y-min/max des données tracées dans une certaine plage. GPVAL_Y_MIN et GPVAL_Y_MAX sont généralement un peu moins utiles car elles vous indiquent où se trouvent les bords de la bordure du tracé (en général, ces valeurs s'étendent un peu au-delà de GPVAL_DATA... variables car gnuplot laisse un peu d'espace entre les données et le bord du tracé).

Pour tirer parti de ces variables, vous devez utiliser les spécificateurs de plage de la commande plot:

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

Soit dit en passant, le u 1:2 la spécification est redondante, sauf si vous voulez vous rappeler quelles colonnes vous tracez, car tracer les deux premières colonnes en x et y est la valeur par défaut de gnuplot. Si vous ne voulez pas replacer sur le même terminal de sortie (ce qui n'est pas utile dans certains terminaux comme eps où le replot crée une deuxième page avec le même tracé), utilisez cette séquence de commandes:

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'

Notez à nouveau l'utilisation du spécificateur de plage, cette fois avec une plage y spécifiée. C'est un peu plus compact que de spécifier avec set yrange, mais crée une ligne de code plus longue.

Si vous avez gnuplot 4.6.0 ou supérieur, vous pouvez tirer parti de la commande stats pour éviter de reploter. La commande stats crée un tas de variables pratiques

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

Une commande légèrement différente,

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

Remplirait le tracé dans la direction x en fonction de l'emplacement des données réelles. Par exemple, si vous aviez des points de données à {(1.1, 3), (2, 4), (2.9,5)}, la plage x serait définie sur [1.1: 2.9].

15
andyras

Définir la plage de valeurs sur GPVAL_DATA_Y_MIN: GPVAL_DATA_Y_MAX présente l'inconvénient de ne pas utiliser la fonctionnalité de mise à l'échelle automatique de gnuplots qui étend les plages au tic suivant.

Dans le traçage automatique, je préfère donc ce qui suit

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

Cela fonctionne bien sûr pour les tracés de données:

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