Mr. Hister takes a list of waves and plots them all evenly spaced with the same size and scaling. Good for comparing histograms.

Mr. Hister takes a string containing a semicolon-seprated list of waves (theHistList)and plots them all at the same size and scaling nicely arranged in a 2D matrix on single graph with multiple axes. Waves are plotted in the order they are listed, so you may want to sort the list appropriately first.

The layout and dimensions of the matrix of plots are determined by the parameters maxDownOrAcross and GoAcross. If GoAcross is 1, there are maxDownOrAcross plots in each row, and the rows are filled first, from left to right. If goAcross is 0, there are maxDownOrAcross plots in each column, and the columns are filled first, from top to bottom. In either case, the size of the dimension not specified by maxDownOrAcross is set by dividing the total number of waves by maxDownOrAcross.

Mr. Hister takes several optional parameters that control layout. The optional titleList is a semicolon-seprated list of strings to be used as tags to add a label to each plot. They must be in the same order as theHistList. If not specified, each plot is labeled with the name of the wave. To have no labels at all, specify titleList = ""

The font and font size for the titles can be set with optional parameters font and fontSize. The defaults is Arial size 10, but this can easily be changed in the first few lines of code.

The spacing between plots is adjustable with the optional parameter spacerPercent. Spacing is measured as a percentage of total horizontal and vertical size. One or two is usually about right.

The axis offset for all axes can be set as a percentage of axis range (the same percentage is used for both horizontal and vertical axes) with the optional parameter axesOffset. This is provided as Mr. Hister creates a free axis for each row and column, and axis standoff does not apply to free axes. The default value is 0 for no offset. For a noticeable offset, try two to five depending on how large a graph size you want to optimize presentation for.

The optional parameter frame underlines each plot (if 1) or draws a box around each plot (if 2). A value of 0 leaves the plots unadorned, and this is the default.
#pragma rtGlobals=1     // Use modern global access method.
#pragma IgorVersion=5
#pragma version = 1      // Last Modified: Jun 13 2008 by Jamie Boyd

Function MrHister (theHistList, maxDownOrAcross, GoAcross, [graphTitleStr, titleList, font, fontSize, spacerPercent, axesOffset, frame])
    string theHistList // list of  waves to be plotted
    variable maxDownOrAcross // number of histograms to appear in whichever of columns or rows is filled first.
        //Size of other dimension is determined by total number of graphs
    variable GoAcross // is 1 if  rows are filled first instead of columns
    string graphTitleStr // desired title for the graph
    string titleList // optional list of titles for each histogram, if not given, name of each wave is used for title
    string font // font for the titles, default is Arial
    variable fontSize // font size for the  titles, default is 10
    variable spacerPercent //Percent of total graph width/height that is used as space beteeen axes. default is 1%
    variable axesOffset // offset of axes, in percent, of axis range, for both vertical and horizontal. default is 0
    variable frame // 0 for no frame, 1 for underline, 2 for a box, default is no frame
   
    // Set default values for optional parameters
    if (ParamIsDefault(graphTitleStr))
        graphTitleStr = "Mr. Hister"
    endif
    variable UsedefaultTitles = 0
    if( ParamIsDefault(titleList))
        titleList = ""
        UsedefaultTitles = 1
    elseif (cmpStr (titleList, "") == 0)
        UsedefaultTitles =-1
    endif
    if( ParamIsDefault(fontSIze))
        fontSIze = 10
    endif
    string fontSizeStr = num2str (fontSize)
    if (fontSize < 10)
        fontSizeStr = "0" + fontSizeStr
    endif
    if( ParamIsDefault(font))
        font = "Arial"
    endif
    if (ParamisDefault (SpacerPercent))
        SpacerPercent = 1
    endif
    SpacerPercent *= .01 // to change from percent to proportion
    //Find maximum and minimum  X and Y values to make all graphs scaled the same
    // Use the same loop to set the default title to the wave name, if using default titles
    variable ii, numHists = itemsinList (theHistList)
    variable maxScal = 0,  maxSecs =0  
    variable minScal = INF, minSecs = INF
    FOR (ii =0 ; ii < numHists; ii+= 1)
        WAVE thehist = $stringfromlist (ii, theHistList, ";")
        if (UsedefaultTitles==1) // default title is the name of the wave.
            titleList += nameofwave (theHist) + ";"
        endif
        wavestats/q thehist
        maxScal = max(V_max, maxScal)
        minScal = min (V_min, minScal)
        maxSecs = max (maxSecs, rightx (thehist))
        minSecs = min (minSecs, leftx (thehist))
    endfor
     //Decommentize next line to add a multiplier to ensure a little room on top of each graph for the label.
        //maxscal = maxScal + ((maxScal - MinScal)*0.05)
    //Figure out the proportion of total vertical and horizontal space for each graph and the number of
        //graphs in each row and column. The way this works is that the function is given  one of rows or
        //columns with maxDownOrAcross, and the size of the other dimeniosn  is calulated from the number of graphs.
    variable leftpercent, bottompercent
    if (GoAcross)
        if (numHists <= maxDownOrAcross)
            bottompercent = (1/ (numHists))
        else
            bottompercent = (1/maxDownOrAcross)
        endif
        if (numHists > maxDownOrAcross)
            leftpercent = 1/(ceil(numHists/maxDownOrAcross))
        else
            leftpercent= 1
        endif
    else
        if (numHists <= maxDownOrAcross)
            leftpercent = (1/ (numHists))
        else
            leftpercent = (1/maxDownOrAcross)
        endif
        if (numHists > maxDownOrAcross)
            bottompercent = 1/(ceil(numHists/maxDownOrAcross))
        else
            bottompercent= 1
        endif
    endif
    // Each row and column gets its own vertical or horizontal axis
    string Laxis, Baxis, condtag
    display as graphTitleStr
    For (ii = 0; ii < numHists; ii += 1)
        WAVE thehist =$stringfromlist (ii, theHistList, ";")
        condtag =  "\\Z" + fontSizeStr + "\\F'" + font + "' " + stringfromlist (ii, titleList, ";")
        if (GoAcross)
            Laxis = "L_" + num2str (floor (ii/maxDownOrAcross))     //down the column varies slowly
            Baxis = "B_" +  num2str (mod (ii, maxDownOrAcross))     //across the row varies quickly
        else
            Laxis = "L_" + num2str (mod (ii, maxDownOrAcross))      //down the column varies quickly
            Baxis = "B_" + num2str (floor (ii/maxDownOrAcross))     //across the row varies slowly
        endif
        appendtograph/L = $Laxis/B = $Baxis thehist
        SetAxis $Laxis  minScal, maxScal
        SetAxis $Baxis  minSecs, maxSecs
        if (GoAcross)
            ModifyGraph axisEnab($Laxis)={1 - ((leftpercent *(floor (ii/maxDownOrAcross)))+ leftpercent - (2*SpacerPercent)),(1-((leftpercent * (floor (ii/maxDownOrAcross))) + (2*SpacerPercent)))}
            ModifyGraph axisEnab($Baxis)={((bottompercent *  (mod (ii, maxDownOrAcross)))+ SpacerPercent),(((bottompercent * (mod (ii, maxDownOrAcross))) + bottompercent - SpacerPercent))}
        else
            ModifyGraph axisEnab($Laxis)={1 - ((leftpercent * (mod (ii, maxDownOrAcross)))+ leftpercent - (2*SpacerPercent)),(1-((leftpercent * (mod (ii, maxDownOrAcross))) + (2*SpacerPercent)))}
            ModifyGraph axisEnab($Baxis)={((bottompercent * (floor (ii/maxDownOrAcross)))+ SpacerPercent),(((bottompercent * (floor (ii/maxDownOrAcross))) + bottompercent - SpacerPercent))}
        endif
        if (frame)
            SetDrawLayer UserBack
            SetDrawEnv xcoord= $Baxis,ycoord= $Laxis
            SetDrawEnv fillpat= 0
            if (frame == 1)
                DrawLine minSecs,minScal,maxSecs,minScal // each histogram underlined
            elseif (frame == 2)
                DrawRect minSecs,minScal, maxSecs, maxscal  // a neat little box around each histogram
            endif
        endif
        if (UsedefaultTitles > -1)
            Tag/N= $("text" + num2str (ii))/B=1/F=0/A=LT/L=0 $NameOfWave(thehist), minSecs, condtag
        endif
    endfor
    //Modify axes crossings to give an axis standoff as percentage of axis range (standoff  do much for free axes)
    variable bOffset = minSecs - ((maxSecs - minSecs) * axesOffset * .01)
    variable lOffset = minScal - ((maxScal - minScal) * axesOffset * .01)
    // Iterate through list of axes, both left and bottom
    variable nLaxes,nBaxes
    if (GoAcross)
         nLaxes = floor (numHists/maxDownOrAcross) + 1
         nBaxes = maxDownOrAcross
    else
        nLaxes = maxDownOrAcross
        nBaxes = floor (numHists/maxDownOrAcross) + 1
    endif
    string LastLaxis = "L_" + num2str (nLaxes -1)
    for (ii = 0; ii < nLaxes; ii += 1)
        Laxis = "L_" + num2str (ii)
        ModifyGraph freePos($Laxis)={bOffset,B_0}
    endfor
    for(ii = 0; ii < nBaxes; ii += 1)
        Baxis = "B_" + num2str (ii)
        ModifyGraph freePos($Baxis)={lOffset,$LastLaxis}
    endfor
    // set graph to Histogram mode. You can change this to whatever you like
    ModifyGraph mode=5,hbFill=2,rgb=(0,0,0)
    // Name the graph same as the graph title, but cleaned up
    string winNameStr = uniquename (cleanupName(graphTitleStr, 0), 6, 0)
    DoWindow/C  $winNameStr
end
Have you seen the Scatter Plot Matrix package? You will find it in Windows->New->Packages->Scatter Plot Matrix.

There is a demo experiment as well, File->Example Experiments->Graphing Techniques->Scatter Plot Matrix Demo.

John Weeks
WaveMetrics, Inc.
support@wavemetrics.com

Forum

Support

Gallery

Igor Pro 8

Learn More

Igor XOP Toolkit

Learn More

Igor NIDAQ Tools MX

Learn More