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)
//Input GradRainbow() for example
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.
July 25, 2024 at 09:11 am - Permalink
Here is an excerpt from my Graph Tools package to get a filtered list of traces from a graph:
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_*",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
July 25, 2024 at 10:13 pm - Permalink
I suggest Tony's Color Traces by Index package may also be useful.
https://www.wavemetrics.com/node/22305
Pick a color tab, apply, and then set all fit_* traces to the same index as their source trace.
July 26, 2024 at 01:09 pm - Permalink