2011-07-03 14 views

Odpowiedz

31

Rozważmy następujący zestaw danych (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 

gdzie chcemy wykreślić dwie pierwsze kolumny tylko wtedy, gdy jedna trzecia jest równa zero. Następnie można spróbować to:

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

(kredyt do markjoe na Gnuplot listy dyskusyjnej.)

+4

Należy zauważyć, że ponieważ '1/0' jest nieprawidłową wartością, spowoduje to problemy, jeśli ktoś zdecyduje się narysować' lines' lub 'linespoints'; jest to omówione na http://stackoverflow.com/questions/11187691/gnuplot-conditional-plotting-2-15-2-1-0-withline – sdaau

15

Przypadek, gdy ktoś chce wykreślić warunkowo na innej kolumnie zawierającej tekst:

danych

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

kod

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" 

komenda

gnuplot <1.par> 1.ps 
5

Jak chl mówi powyżej, jedynym sposobem, aby to zrobić w gnuplot jest dość hacky: trzeba użyć Gnuplot za terniary: operator wygeneruje błąd numerycznych na punkty, które chcesz filtrować z twój zestaw danych.

Mogę być stronniczy tutaj, ponieważ jestem autorem projektu, ale możesz chcieć rzucić okiem na Pyxplot http://www.pyxplot.org.uk (również wolne i otwarte źródło), napisane przez grupę użytkowników gnuplot, którzy byli trochę nakarmieni z tak hackowatą składnią.

Jego składnia jest bardzo podobna do gnuplot, ale z rozszerzeniami. Jeśli chcesz, możesz określić "kryterium selekcji" w komendzie fabuły, a punkty są uwzględniane tylko wtedy, gdy testowane są wartości Prawda. Aby uzyskać więcej informacji, patrz http://pyxplot.org.uk/current/doc/html/sec-select_modifier.html.

+0

Zamiast używać 1/0, możesz po prostu użyć NaN (nie a Number), który ma dokładnie taki sam efekt, ale wydaje się bardziej estetyczny. –

4

Kolejny Hack byłoby użyć polecenia powłoki jak awk:

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

Jeśli wywołanie skryptu korzystania column(2) zamiast $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" 
Powiązane problemy