Create Density Matrix From XY Data Points

// NOTE: This is experimental - not thoroughly tested.
//
//  CreateDensityMatrix(xw, yw, numXElements, numYElements, matName)
//  xw and yw contain the location of stars in a galaxy.
//  We want to create a contour plot of the density of stars.
//  To create a contour plot we first need to create a matrix whose X and Y
//  values cover the range of data in xw and yw and whose Z values count
//  the number of stars in a given box (pixel) in the matrix.
//
//  Example:
//      Make/O/N=10000 xData=gnoise(1), yData=gnoise(1)
//      CreateDensityMatrix(xData, yData, 100, 100, "densityMat")
//      NewImage densityMat
//      AppendMatrixContour/T densityMat
Function CreateDensityMatrix(xw, yw, numXElements, numYElements, matName)
    Wave xw, yw
    Variable numXElements           // Number of X elements in output matrix
    Variable numYElements           // Number of Y elements in output matrix
    String matName                  // Name to use for output matrix
   
    // Make matrix with specified number of X and Y elements.
    // NOTE: This overwrites an existing wave with the specified name.
    Make/O/N=(numXElements,numYElements) $matName
    Wave mat = $matName         // Create wave reference for the matrix
    mat = 0
   
    WaveStats/Q xw              // Find the X range
    Variable xMin = V_min
    Variable xMax = V_max
    Variable xSpan = xMax - xMin
   
    WaveStats/Q yw
    Variable yMin = V_min
    Variable yMax = V_max
    Variable ySpan = yMax - yMin

    // Set the X and Y scaling of the matrix
    SetScale x xMin, xMax, mat
    SetScale y yMin, yMax, mat
   
    // Create temporary wave containing the X element number for a given point in the input x wave
    Variable numXPoints = numpnts(xw)
    Make/O/N=(numXPoints) xElementNumbersTemp
    xElementNumbersTemp = round(numXElements*(xw-xMin)/xSpan)
   
    // Create temporary wave containing the Y element number for a given point in the input x wave
    Variable numYPoints = numpnts(yw)
    Make/O/N=(numYPoints) yElementNumbersTemp
    yElementNumbersTemp = round(numYElements*(yw-yMin)/ySpan)
   
    Variable xElement, yElement
    for (xElement=0; xElement<numXElements; xElement+=1)
        Variable xEl = xElementNumbersTemp[xElement]
        for (yElement=0; yElement<numXElements; yElement+=1)
            Variable yEl = yElementNumbersTemp[yElement]
            mat[xEl][yEl] += 1
        endfor
    endfor
   
    KillWaves/Z xElementNumbersTemp, yElementNumbersTemp
End

Dear Sir, I am a very lamdad Igor user and I need to plot density coloured plots. Your procedure appears to me adquate in order to build from my xy data the matrix that will fit them. However, I don not even know how to incorporate the matrix in one my Igor experiment. Could you give me some advices ? Thank you in advance for your consideration. Yours sincerely Jean-René Cazalets
There is also a WaveMetrics Procedure, Bivariate Histogram 2. To use it, add this line near the top of the Procedure Window:

#include <Bivariate Histogram 2>

Then close the Procedure Window. Now you will find under the Macros menu, an item "Bivariate Histogram" that leads to a submenu with variations on the theme. The documentation is entirely in the form of comments at the top of the procedure file. To read them, select Windows->Procedure Windows->Bivariate Histogram 2.ipf. The Macros menu items lead to a very simple GUI so that you don't have to type out the function invocation on the command line.

John Weeks
WaveMetrics, Inc.
support@wavemetrics.com

Forum

Support

Gallery

Igor Pro 9

Learn More

Igor XOP Toolkit

Learn More

Igor NIDAQ Tools MX

Learn More