
Automatically label axes according to the plotted waves or trace names

jcor
Run autoLabelAxes(symbol=2) to label all axes by their trace names.
#pragma TextEncoding = "UTF-8" #pragma rtGlobals=3 // Use modern global access method and strict wave access #pragma DefaultTab={3,20,4} // Set default tab width in Igor Pro 9 and later // Label all axes according to the plotted trace, iff one trace is plotted. function autoLabelAxes([symbol]) // If two traces are plotted, no change is made to the label. // variable symbol : Adds the legend symbol of the trace as well. // // Bar charts and fancy colours are not supported. // Adapted from autoColourAxes() by jcc on 170724. // // autoLabelAxes() // axes labelled with "\c" (wave name) // autoLabelAxes(symbol=1) // axes labelled with "symbol and trace name" (like Legend) // autoLabelAxes(symbol=2) // axes labelled with "trace name" (like Legend but no symbol) // variable symbol // 1. Use tracerepeat() to get trace list string visibleTraces= TraceNameList("", ";", 2^0 + 2^1 + 2^2) string topwin= winList("*","","WIN:") variable i, n_traces= itemsInList(visibleTraces) variable n_axes= itemsinList(AxisList(topwin)) string cmd string nxLabel string pastAxes= "" string unchangedList= "" if (n_traces==1) // don't bother with symbols when one trace symbol=0 elseif (paramIsDefault(symbol) && (n_axes-1)<3) // just a couple axes, do it symbol=1 elseif (paramIsDefault(symbol) && strlen(getSmartSortedAxisList(type="right", win=topwin)) && strlen(getSmartSortedAxisList(type="left", win=topwin))) // opposite sided axes, do it symbol=1 endif // somehow this command is orphaned.... if (GrepString(AxisList(topwin), "bottom")) Label bottom, "\\c" else print "" endif // uando print "bottom/top axes not handled properly by autolabelaxes() 180420....also slash TN tracenames" for (i=0; i<n_traces; i+=1) // 2. use TraceInfo to get trace axes & trace colour (via TraceInfo) string nxTrace= stringFromList(i, visibleTraces) string nxtInfo= TraceInfo(topwin, nxTrace, 0) // also works, but less controlled: TraceInfo("", "", 1) nxtInfo= replaceString("RECREATION:", nxtInfo, "") // list goes: RECREATION:zColor(x)=[..];zColorMin(x)=[..];[..] so this allows 1st item retrieval string nxtAxis, nxtAxisFlag= StringByKey("AXISFLAGS", nxtInfo) strswitch (nxtAxisFlag) case "": // means "/L": nxtAxis= "left" break case "/R": nxtAxis= "right" break default: nxtAxis= stringFromList(1, nxtAxisFlag,"/")[2,inf] // -> custom, like " /L=customAxis"...omit the /L= and the following /B= stringFromList(1, nxtAxisFlag,"/") endswitch string currLabel= AxisLabelText(topwin, nxtAxis) // check if axis was already treated variable alreadyTreated= strlen(grepList(pastAxes, nxtAxis)) if (alreadyTreated && !symbol) elseif (alreadyTreated && symbol) if (symbol) // update existing label if (symbol==2) nxLabel= "\\JL\\r" + currLabel + nxTrace else nxLabel= "\\JL\\r" + currLabel + "\\r\s("+nxTrace+") " + nxTrace endif else // revert to previous label currLabel= grepList(unchangedList, nxtAxis) // REDUNDANT?? never used... nxLabel= currLabel endif else // build new label if (symbol) if (symbol==2) nxLabel= nxTrace else nxLabel= "\s("+nxTrace+") " + nxTrace endif else nxLabel= "\\c" endif pastAxes+= nxtAxis unchangedList+= currLabel endif // check if wave symbols were already coloured (zcolor) string thisZcol= StringByKey("zcolor(x)", nxtInfo, "=", ";") variable zColourOn= cmpstr(thisZcol,"0")!=0 if (zColourOn && symbol && 0 && 0 && 0) // TODO/future feature.... change marker/line to black, so symbols aren't confusing endif // 3. apply trace colour to trace axis sprintf cmd, "Label %s \"%s\"", nxtAxis, nxLabel execute cmd endfor // 4. if axis has been coloured before, make black (if really want to waste time programming, add a coloured box to trace label for each colour (Signal [RED] [BLUE]) return 1 end // Get a sorted list of left//right//bottom//top axes. Internal function. function /s getSmartSortedAxisList([type, win, defaultAxFirst]) string type // "left", "right", "bottom", or "top" (== AXTYPE from AxisInfo()) string win variable defaultAxFirst// put axis named "left" at top of list of left axes, etc if (ParamIsDefault(win)) win= "" else // check existence of window GetWindow /Z $win wtitle if (V_flag != 0) return "" // no window found endif endif // get and prune axis list string allAxes = AxisList(win) string axes = "" // return axes of this type only variable i,n=itemsInList(allAxes) for (i=0; i<n; i+=1) string thisAxis= stringFromList(i,allAxes) string thisAxType= StringByKey("AXTYPE", AxisInfo(win, thisAxis)) if (stringmatch(thisAxType, type)) // put default axis first if (stringmatch(thisAxis, type)) axes = thisAxis + ";" + axes else axes += thisAxis + ";" endif endif endfor // were any axes found? if (!strlen(axes)) return "" endif // sort axes according to their current order, if one exists (no special treatment of 'left') n=itemsInList(axes) variable enab0, enab1 string ax, axEnabStr make /free /n=(n) enab0w, enab1w, d_enab make /free /T /n=(n) axNames for (i=0; i<n; i+=1) // get all ranges ax= stringFromList(i,axes) axEnabStr= stringByKey("axisEnab(x)", AxisInfo(win, ax), "=", ";") sscanf axEnabStr, "{%g,%g}", enab0, enab1 axNames[i]= ax enab0w[i]= enab0 enab1w[i]= enab1 endfor Sort enab0w, axNames, enab1w, enab0w // sort by start positions d_enab= enab1w[p] - enab0w[p] // check if overlap 1/2 if (waveMin(d_enab) >= 0) // check if overlap 2/2 // no overlap: sort axes axes= textwave2list(axNames) else // either something weird, or no sort exists yet endif return axes end // GRABBED FROM #include <Axis Utilities> VIA http://www.igorexchange.com/node/603 // Returns the text of the axis label. // If optional parameter SuppressEscaping is non-zero, extra backslashes ("\\" is required // to include a single backslash in a quoted string) are removed // so that the result is a string suitable to be passed directly to the Label operation. STATIC Function/S AxisLabelText(graphName, axisName, [SuppressEscaping]) String graphName, axisName Variable SuppressEscaping if (ParamIsDefault(SuppressEscaping)) SuppressEscaping = 0 endif String axisLabel="" String info= WinRecreation(graphName,0) Variable start= strsearch(info, "Label "+axisName, 0) if( start >= 0 ) start = strsearch(info, "\"", start)+1 Variable theEnd= strsearch(info, "\"", start)-1 axisLabel= info[start,theEnd] endif if (SuppressEscaping) start = 0 do start = strsearch(axisLabel, "\\\\", start) // search for double backslash if (start >= 0) string newLabel = axisLabel[0,start-1] newLabel += axisLabel[start+1, strlen(axisLabel)-1] axisLabel = newLabel else break endif while(1) endif return axisLabel End // Given a text wave reference, returns a string-list formatted version of the wave. function/s textwave2list(w[, sep]) // printed using %s. // e.g. make /T w={"a","b","c"}; print textwave2list(w) returns "a;b;c" wave /T w string sep // optionally specify list delimiter if (ParamIsDefault(sep)) sep=";" endif if (!WaveExists(w) || numpnts(w)==0) return "" endif string str wfprintf str, "%s;", w return str end


Forum

Support

Gallery
Igor Pro 9
Learn More
Igor XOP Toolkit
Learn More
Igor NIDAQ Tools MX
Learn More