Tuesday, September 20, 2011

Gnuplot I/O: Use fit command to scanf data from files

We usually record our data as follows:
```x0         y0
x0+dx      y1
x0+2*dx    y2
...
```
In fact there is so much redundancy. For the first column we only need to record two numbers x0 and dx. So in a compact format the data can be stored as:
```x0
dx
y0
y1
y2
...
```
Some one may say "these days the memory is so cheap, I do not care the bytes". But have you consider the speed? When you come to process the data, the larger the data file is, the longer time will your program takes. So this new format is worthy.

Firstly we need to read x0 and dx out form the file. As for gnupot there is no functions like scanf in c programming language, we need to play a trick here. We use command fit to read the data out. We known that if there is only two point, the fitting result using function f(x)=a*x+b will be exact. So we use command
```fit f(x) "my_format.dat" u 0:1 every ::0::1 via a,b
```
to fit the first two points. Then we get x0=f(0), dx=f(1). Now the xvalue can be generated by x0+\$0*dx. As the xvalue has been prepared, we can come to plot the data file. Now Let me show an example. The plotting script reads:
```reset
set term png font "Times,18"
set output "my_format.png"
f(x)=a*x+b
fit f(x) "my_format.dat" u 0:1 every ::0::1 via a,b
x0=f(0)
dx=f(1)
set xlabel "Time(ms)"
set ylabel "Light Intensity(Arbitary Unit)"
set mxtics 5
set mytics 2
set grid xtics mxtics ytics mytics
set offset 0,0,0.05,0
plot "my_format.dat" u (x0+\$0*dx):1 every ::2 with lines linewidth 2 notitle
```
Data file my_format.dat can be downloaded here. And the graph is shown below.