2011-07-03 2 views
24

Comment puis-je faire en gnuplot:gnuplot conditionnelle traçage: terrain col A: col B si col C == x

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

Il ne doit sélectionner les lignes où la colonne 3 == 80,0 et ignorer tous les autres rows (Il ne doit pas tracer un 0 pour les autres lignes, il suffit de les ignorer)

Merci d'avance.

+0

Que diriez-vous de terrain 3 $ seulement si elle n'a pas égal à 2 $? – SDsolar

Répondre

31

Tenir compte 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 que lorsque le troisième est égal à zéro. Ensuite, vous pouvez essayer:

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

(Crédit markjoe sur liste de diffusion Gnuplot.)

+4

Notez que puisque '1/0' est une valeur invalide, cela causera des problèmes si on choisit de tracer' lines' ou 'linespoints'; ceci est discuté dans http://stackoverflow.com/questions/11187691/gnuplot-conditional-plotting-2-15-2-1-0-with-lines – sdaau

15

cas où l'on veut tracer certaines conditions sur une autre colonne contenant du texte:

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" 

commande

gnuplot <1.par> 1.ps 
5

Comme chl dit ci-dessus, la seule façon de le faire en GNUPlot est plutôt aki: vous devez utiliser terniary de gnuplot: opérateur de générer une erreur numérique sur les points que vous souhaitez filtrer sur votre jeu de données. Je peux être biaisé ici car je suis un auteur sur le projet, mais vous voudrez peut-être jeter un oeil à Pyxplot http://www.pyxplot.org.uk (aussi libre et open source), écrit par un groupe d'utilisateurs de gnuplot qui étaient un peu nourris avec la syntaxe hacky comme ça.

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 plot, et les points ne sont inclus que s'il vérifie True. Voir http://pyxplot.org.uk/current/doc/html/sec-select_modifier.html pour plus d'informations.

+0

Plutôt que d'utiliser 1/0, vous pouvez simplement utiliser NaN (Non un nombre), qui a exactement le même effet mais semble plus esthétique. –

4

Une autre astuce serait d'utiliser une commande shell comme awk:

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

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" 
Questions connexes