Search code examples
for-loopgnuplotcurve-fittingdo-loopsgnuplot-iostream

How to plot on the same graph with for cycles with Gnuplot?


I want to fit multiple data set and plot the result on the same graph, what I' am doing is:

do for [i=2:500]{
fit f(x) "myData" using 1:i via a,b
plot f(x)
}

The fit works fine, the big problem is that this code produce a different plot at each iteration. I would like to have all the fitted functions in a single graph. Is there any way ?


Solution

  • I guess you cannot fit and plot in the same loop. Well, there would be the multiplot environment (check help multiplot), but I guess this is not your idea. So, you can fit in a do for loop and store the fitted parameters in an array for later use during plotting. You didn't specify any function, so I assumed something. Check the following minimized example:

    Code:

    ### fitting in a loop
    reset session
    
    $Data <<EOD
    1   1   6    4
    2   4  10    1  
    3   9  15    0
    4  16  22    1
    5  25  31    4
    6  36  42    9
    7  49  55   16
    EOD
    
    f(x,a,b,c) = a*(x-b)**2 + c
    colMin = 2
    colMax = 4
    set fit quiet nolog
    array A[colMax]
    array B[colMax]
    array C[colMax]
    
    do for [col=colMin:colMax] {
        a=1; b=1; c=1             # some initial values, sometimes 0 or NaN is not a good start
        fit f(x,a,b,c) $Data u 1:col via a,b,c
        A[col] = a;  B[col] = b;  C[col] = c
    }
    
    set key top left
    plot for [col=colMin:colMax] $Data u 1:col w p pt 7 title sprintf("Column %d",col), \
         for [col=colMin:colMax] f(x,A[col],B[col],C[col]) w l \
              title sprintf("a=%.2f, b=%.2f, c=%.2f",A[col],B[col],C[col])
    ### end of code
    

    Result:

    enter image description here