gnuplot: wykreślanie danych z wielu plików wejściowych na jednym wykresie

84

Próbuję wykreślić wykres za pomocą gnuplot. Mam sześć plików tekstowych. Każdy plik tekstowy zawiera dwie kolumny. Pierwsza kolumna przedstawia czas w sekundach (liczba zmiennoprzecinkowa). Drugi to numer kolejny. Chcę wykreślić wykres czasu w funkcji numeru sekwencyjnego na jednym wykresie dla wszystkich sześciu plików. W tym celu używam tego pliku.

set terminal png
set output 'akamai.png'

set xdata time
set timefmt "%S"
set xlabel "time"

set autoscale

set ylabel "highest seq number"
set format y "%s"

set title "seq number over time"
set key reverse Left outside
set grid

set style data linespoints

plot "print_1012720" using 1:2 title "Flow 1", \
plot "print_1058167" using 1:2 title "Flow 2", \
plot "print_193548"  using 1:2 title "Flow 3", \ 
plot "print_401125"  using 1:2 title "Flow 4", \
plot "print_401275"  using 1:2 title "Flow 5", \
plot "print_401276"  using 1:2 title "Flow 6"

Gdzie są moje pliki:

  • print_1012720
  • print_1058167
  • print_193548
  • print_401125
  • print_401275
  • print_401276

Daje dziwny błąd, jak poniżej:

"plot.plt", wiersz 24: niezdefiniowana zmienna: plot

czy robię coś źle? Czy możliwe jest wykreślenie danych wejściowych z różnych plików na tym samym wykresie?

liv2hak
źródło
Bądź sprytny, przejdź do tego tematu stackoverflow.com/questions/14946530/…
Marcos Alex

Odpowiedzi:

133

Jesteś tak blisko!

Zmiana

plot "print_1012720" using 1:2 title "Flow 1", \
plot "print_1058167" using 1:2 title "Flow 2", \
plot "print_193548"  using 1:2 title "Flow 3", \ 
plot "print_401125"  using 1:2 title "Flow 4", \
plot "print_401275"  using 1:2 title "Flow 5", \
plot "print_401276"  using 1:2 title "Flow 6"

do

plot "print_1012720" using 1:2 title "Flow 1", \
     "print_1058167" using 1:2 title "Flow 2", \
     "print_193548"  using 1:2 title "Flow 3", \ 
     "print_401125"  using 1:2 title "Flow 4", \
     "print_401275"  using 1:2 title "Flow 5", \
     "print_401276"  using 1:2 title "Flow 6"

Błąd pojawia się, ponieważ gnuplot próbuje zinterpretować słowo „plot” jako nazwę pliku do plotowania, ale nie przypisałeś żadnych ciągów do zmiennej o nazwie „plot” (co jest dobre - byłoby to bardzo zagmatwane).

mgilson
źródło
74

Może się okazać, że pętle for gnuplot są przydatne w tym przypadku, jeśli odpowiednio dostosujesz nazwy plików lub tytuły wykresów.

na przykład

filenames = "first second third fourth fifth"
plot for [file in filenames] file."dat" using 1:2 with lines

i

filename(n) = sprintf("file_%d", n)
plot for [i=1:10] filename(i) using 1:2 with lines
Richard
źródło
6
Wiem, że to jest stare, ale dziękuję za dodanie tego alternatywnego rozwiązania. Nie wiedziałem o pętlach w gnuplot i są one niesamowitą funkcją.
Amit
Zakładając normalną konwencję nazw plików (name.dat), myślę, że powinien to być plik. ". Dat". Pierwszy . łączy nazwę pliku z „dat”, ale nie jest uwzględniana w nazwie pliku faktycznie używanej w poleceniu kreślenia.
jake
Jak mogę wykreślić wszystkie pliki w katalogu bez jawnego wpisywania ich nazw? ( stackoverflow.com/q/29969393/855050 )
becko
Dodałem odpowiedź na to pytanie, @becko.
Richard
22

replot

To kolejny sposób na uzyskanie wielu działek naraz:

plot file1.data
replot file2.data
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
źródło
1
najlepsza odpowiedź, pierwsza nie zadziałała. Wynik brzmiał: „format musi mieć 1-7 konwersji typu double (% lf)”. Podczas gdy inne opcje pozwalają to zrobić tylko wtedy, gdy wszystkie kolumny danych są takie same.
RSM,