liv2hak
liv2hak

Reputation: 15010

gnuplot : plotting data from multiple input files in a single graph

I am trying to plot a graph using gnuplot. I have six text files. Each text file contains two columns. The first column represents time in seconds (a floating point number). The second one is a sequence number. I want to plot the graph of time vs. sequence number in a single graph for all six files. I am using this file to do that.

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"

Where my files are:

It is giving a strange error as below:

"plot.plt", line 24: undefined variable: plot

Am I doing something wrong? Is it possible to plot the input data from different files in the same graph?

Upvotes: 94

Views: 242493

Answers (3)

replot

This is another way to get multiple plots at once:

main.gnuplot

plot file1.data
replot file2.data

Run:

gnuplot -p tmp.gnuplot

It does not work on PNG output, only on the interactive window. Sample output:

enter image description here

Test data:

python -c 'for i in range(10): print(f"{i} {i}")' > file1.dat
python -c 'for i in range(10): print(f"{i} {i*i}")' > file2.dat

The documentation is present at: http://www.gnuplot.info/docs_4.2/node150.html

Tested on gnuplot 5.4.4, Ubuntu 23.10.

Upvotes: 33

mgilson
mgilson

Reputation: 310227

You're so close!

Change

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"

to

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"

The error arises because gnuplot is trying to interpret the word "plot" as the filename to plot, but you haven't assigned any strings to a variable named "plot" (which is good – that would be super confusing).

Upvotes: 146

Richard
Richard

Reputation: 61499

You may find that gnuplot's for loops are useful in this case, if you adjust your filenames or graph titles appropriately.

e.g.

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

and

filename(n) = sprintf("file_%d", n)
plot for [i=1:10] filename(i) using 1:2 with lines

Upvotes: 83

Related Questions