# Coloring a "fit_" wave the same as the data wave

I have generated a function to color the waves on my top graph in a rainbow gradient, but if I run the function after I have plotted the fit_ waves, they are included in the gradient and are different colors from the data they are fitted to.

I have played around with using less direct methods to color the fit_ waves to be the same as the data, but it is not quite what I want and there are several instances where I could see it failing.

Is there a way to have my function to color the wave name, then do an if/then if there is another wave on the graph that contains the "fit_" appended?

Below is my coloring function and how it is set up for reference. In order to get this version to function, I have to interlace the wave order so the the fit waves followed each data wave. The last two lines are what allow this to work.

//Makes rainbow gradient between roy and biv (with a lil g in between)
GetWindow kwTopWin, title

ModifyGraph/Z mirror=2
ModifyGraph/Z lSmooth=1,lHair=1,minor(bottom)=0
ModifyGraph/Z lsize=2
Variable i,r,g,b
Variable j =  ItemsInList(TraceNameList(S_value,";",1))-1

Make/O/D red = {65535,0,0}
Make/O/D orange = {65535,42405,0}
Make/O/D yellow = {65535,55255,0}
Make/O/D green = {0,51120,0}
Make/O/D blue = {0,0,65535}
Make/O/D indigo = {19199,0,33279}
Make/O/D violet = {38036,0,54227}

Make/O/D w = {0,0,0}
wave c1 = red
wave c2 = orange
wave c3 = yellow
wave c4 = green
wave c5 = blue
wave c6 = indigo
wave c7 = violet

for(i=0;i<=j;i+=1)
if(i<(1/6*j))
w = c1-(c1-c2)*(i/(j/6))
endif
if(i==(1/6*j))
w = c2
endif
if(i>(1/6*j))
if(i<(2/6*j))
w = c2-(c2-c3)*((i-j/6)/(j/6))
endif
endif
if(i==(2/6*j))
w = c3
endif

if(i>(2/6*j))
if(i<(3/6*j))
w = c3-(c3-c4)*((i-2*j/6)/(j/6))
endif
endif

if(i==(3/6*j))
w = c4
endif
if(i>(3/6*j))
if(i<(4/6*j))
w = c4-(c4-c5)*((i-3*j/6)/(j/6))
endif
endif

if(i==(4/6*j))
w = c5
endif
if(i>(4/6*j))
if(i<(5/6*j))
w = c5-(c5-c6)*((i-4*j/6)/(j/6))
endif
endif

if(i==(5/6*j))
w = c6
endif
if(i>(5/6*j))
if(i<(6/6*j))
w = c6-(c6-c7)*((i-5*j/6)/(j/6))
endif
endif

if(i==(6/6*j))
w = c7
endif

r = w[0]
g = w[1]
b = w[2]
ModifyGraph/Z rgb[i]=(r,g,b)
ModifyGraph/Z rgb[i+1]=(r,g,b)
i=i+1
endfor

End

You could pre-process the list of traces to remove all the traces that start with "fit_". Then, as you iterate through the list, color the current trace (with a given name) as desired. Then test for the existence of a trace with the name "fit_"+name. If it exists, color it, too.

To create the filtering function for the "fit_" waves, use stringmatch("fit_*", tracename) to test for a match.

Here is an excerpt from my Graph Tools package to get a filtered list of traces from a graph:

function/S FetchTraces(string win, string filter, int inverse)
string tempList = "", traces = TraceNameList(win,";",1)
int i, items = ItemsInList(filter)
if (strlen(filter) && CmpStr(filter,"*"))
if (inverse)
for (i = 0; i < items; i++)
traces = RemoveFromList(ListMatch(traces,StringFromList(i,filter)),traces)
endfor
else
for (i = 0; i < items; i++)
tempList += ListMatch(traces,StringFromList(i,filter))
endfor
traces = tempList
endif
endif
return traces
end

The 'inverse' parameter decides if you want to include or omit the filtered traces.

Try this:

print FetchTraces("","fit_*",0)
print FetchTraces("","fit_*",1)

The 'filter' string can also be a semicolon-separated list of filter conditions, such as "fit_*;*data1*;".

By the way, if you want to use a convenient panel for your coloring needs, you may want to have a look at my Graph Tools package:

https://www.wavemetrics.com/node/21562

Also, if you want to have 'fit_' traces recolored while quickly fitting data, this is supported in my Super Quick Fit package, where you can choose from a few coloring options (I also can add more if needed):

https://www.wavemetrics.com/node/21866