Search code examples
gnuplot

Gnuplot, normalize over x axis


I've got two datasets referring to the same process executed in two different ways. The execution A is slower than the execution B with respect to real time, but the two graphs represent the same phenomena..

I can plot the two together as follows:

plot 'A' using 1:2, 'B' using 1:2

But I obtain two graphs with different X scales: A was slower, so the graph is much.

I can normalize the graph by doing the following:

plot 'A' using ($1 / maxA):2, 'B' using ($1 / maxB):2

Which works perfectly for me. The only problem being the maxA and maxB variables. They are trivial to determine (tail -n1 A | cut -f1 and tail -n1 B | cut -f1 respectively), but I was wondering if there's an automated way of doing it.

Thanks in advance for any kind answer.

Update

After I applied the excellent answer from Wrzlprmft, I finally got to the following pattern, which is quite convenient:

max(Source) = system('tail -n ' . Source . '| cut -f1')

A = 'path/to/A'
maxA = max(A)
plot A using ($1 / maxA):2

Another possible improvement could be including a Column parameter to the max function, so that we can also tune the param of the -f flag in cut.

Update

Changed my mind on acceptance, since the stats command seems to be better for this purpose.

Thanks everyone.


Solution

  • Alternative is to use the stats command in gnuplot, without any external programs:

    stats datafA using 1:2 name "A"
    stats datafB using 1:2 name "B"
    
    plot datafA using 1:2, datafB using ($1/B_max_x*A_max_x)
    

    It also produces a lot more useful statistics of your data, check the variables it produces with show var A (or B, or STATS if you didn't supply a name).

    OR (different solution), you plot B on the x2y1 coordinate system, where the x2 axis gets autoscaled independently.

    set xtics nomirr
    set x2tics 
    set xrange [*:*] noextend # make sure the scaling is coherent
    set x2range [*:*] noextend # by switching off extension
    set link x2 via x*factor inverse x/factor # alternative, for gp>=v5.2
    plot datafA us 1:2, datafB us 1:2 axes x2y1
    

    If you know the relation between your abscissa values, you can directly link the two axes since gp 5.2