web-dev-qa-db-fra.com

gnuplot tracé conditionnel: tracé col A: col B si col C == x

Comment puis-je faire cela dans gnuplot:

plot "test.csv" using 1:2 if value_in_column_3 == 80.0

Il ne doit sélectionner que les lignes où la colonne 3 == 80.0 et ignorer toutes les autres lignes (il ne doit pas tracer un 0 pour les autres lignes, simplement les ignorer)

Merci d'avance.

28
jitihsk

Considérez l'ensemble de données suivant (1.dat),

1 0.8 0
2 0.6 0
3 0.9 1
4 1.1 0
5 0.7 0
6 0.6 1

où nous voulons tracer les deux premières colonnes uniquement lorsque la troisième est égale à zéro. Ensuite, vous pouvez essayer ceci:

plot '1.dat' using 1:($3==0?$2:1/0)

(Nous remercions markjoe sur la liste de diffusion Gnuplot.)

36
chl

Cas où l'on veut tracer conditionnellement sur une autre colonne contenant du texte:

les données

1 0.8 a
2 0.6 a
3 0.9 a
1 2.1 b
2 1.7 b
3 1.6 b

code

set terminal postscript color
set xrange [0:4]
set yrange [0:3]
plot "1.dat" using 1:(stringcolumn(3) eq "a"? $2:1/0) title "a" lc rgb "blue" ,\
  "" using 1:(stringcolumn(3) eq "b"? $2:1/0) title "b" lc rgb "red"

commander

gnuplot < 1.par > 1.ps
17
tflutre

Comme le dit chl ci-dessus, la seule façon de le faire dans gnuplot est plutôt hacky: vous devez utiliser l'opérateur terniaire?: De gnuplot pour générer une erreur numérique sur les points que vous souhaitez filtrer de votre ensemble de données.

Je peux être biaisé ici car je suis un auteur du projet, mais vous voudrez peut-être jeter un œil à Pyxplot http://www.pyxplot.org.uk (également gratuit et open source) , écrit par un groupe d'utilisateurs de gnuplot qui en avaient un peu marre de la syntaxe hacky comme celle-ci.

Sa syntaxe est très similaire à gnuplot, mais avec des extensions. Pour ce que vous voulez, vous pouvez spécifier un "critère de sélection" dans la commande de tracé, et les points ne sont inclus que si elle teste True. Voir http://pyxplot.org.uk/current/doc/html/sec-select_modifier.html pour plus d'informations.

5
Dominic Ford

Un autre hack serait d'utiliser une commande Shell comme awk:

plot "< awk '$3==80.0 { print $1, $2 }' test.csv" using 1:2
5
user2817215

Si vous appelez un script, utilisez column(2) au lieu de $2

plot "1.dat" using 1:(stringcolumn(3) eq "a"? column(2):1/0) title "a" lc rgb "blue" ,\
  "" using 1:(stringcolumn(3) eq "b"? column(2):1/0) title "b" lc rgb "red"
3
Dina Said