Stacked plots / Multiple plots graph
ChrLie
Not extensively tested, but it might be useful for one or the other. To test it:
make/D/O/N=1000 aa, bb, cc, dd
setscale/i x, 0, 3*pi, "", aa,bb, cc, dd
aa=sin(x)
bb=cos(x)
cc= tan(x)
dd=abs(sin(x))
setscale/i x, 0, 3*pi, "", aa,bb, cc, dd
aa=sin(x)
bb=cos(x)
cc= tan(x)
dd=abs(sin(x))
Then use:
function MakeStackedGraph(yWaveList, xWaveList, nCols, spacing, GraphName, mirror)
string yWaveList // semicolon separated list containing wave names to be plotted
string xWaveList // semicolon separated list containg corresonding x data; if list items are empty, y-waves will be plotted against x-scaling
variable nCols // number of columns within the stacked graph
variable spacing // spacing between plots in terms of fraction of total plot area
string GraphName // name of the stacked graph
variable mirror // mirror axis on = 1, or off = 0
variable nGraphs
variable nRows
variable nGaps
variable yLength
variable xLength
variable y0, x0, y1, x1
variable i, j, n = 0
string yWave, xWave
string yAxisName, xAxisName, yMirrorName, xMirrorName
// how many graphs are there and how many rows are required
nGraphs = ItemsInList(yWaveList)
nRows = ceil(nGraphs / nCols)
// calculate length of axis from given spacing
nGaps = nCols - 1
xLength = (1 - spacing * nGaps) / nCols
nGaps = nRows - 1
yLength = (1 - spacing * nGaps) / nRows
// Display empty window; kill if it exists
DoWindow/F $GraphName
if(V_flag)
KillWindow $GraphName
endif
Display/K=1 /N= $Graphname
// append traces
for(i=0; i<nRows; i+=1)
// reset vertical axis position
y0 = 0
x1 = 0
for (j=0; j< nCols; j+=1)
// get wave names from lists
yWave = StringFromList(n, yWaveList)
yAxisName = "yAxis" + num2str(n)
xWave = StringFromList(n, xWaveList)
xAxisName = "xAxis" + num2str(n)
if(strlen(xWave) == 0)
// if x-string is empty; plot against wave scaling
AppendToGraph/L=$yAxisName /B=$xAxisName $yWave
else
AppendToGraph/L=$yAxisName /B=$xAxisName $yWave vs $xWave
endif
// set lower left position of y and x axis
ModifyGraph freePos($yAxisName)={y0,kwFraction}
ModifyGraph freePos($xAxisName)={x0,kwFraction}
// set length of the axis
ModifyGraph axisEnab($yAxisName)={y1,(y1+yLength)}
ModifyGraph axisEnab($xAxisName)={x1,(x1+xLength)}
// do some formatting
ModifyGraph tick($yAxisName) = 2, tick($xAxisName) = 2
ModifyGraph btlen($yAxisName) = 4, btlen($xAxisName) = 4
// append mirror axis
if(mirror)
yMirrorName = "yMirror" + num2str(n)
NewFreeAxis/L $yMirrorName
ModifyFreeAxis $yMirrorName master = $yAxisName
ModifyGraph freePos($yMirrorName) ={(y0+xLength), kwFraction}
ModifyGraph axisEnab($yMirrorName) ={y1, (y1+ylength)}
ModifyGraph noLabel($yMirrorName)=2
ModifyGraph tick($yMirrorName) = 0, btlen($yMirrorName) = 4
xMirrorName = "xMirror" + num2str(n)
NewFreeAxis/B $xMirrorName
ModifyFreeAxis $xMirrorName master = $xAxisName
ModifyGraph freePos($xMirrorName) ={(x0+yLength), kwFraction}
ModifyGraph axisEnab($xMirrorName) ={x1, (x1+xlength)}
ModifyGraph noLabel($xMirrorName)=2
ModifyGraph tick($xMirrorName) = 0, btlen($xMirrorName) = 4
endif
// shift next starting positions to the right
y0 += xLength + spacing
x1 += xlength + spacing
// increase plot counter
n += 1
endfor
// shift next starting positions up
x0 += yLength + spacing
y1 += yLength + spacing
endfor
return 1
end
string yWaveList // semicolon separated list containing wave names to be plotted
string xWaveList // semicolon separated list containg corresonding x data; if list items are empty, y-waves will be plotted against x-scaling
variable nCols // number of columns within the stacked graph
variable spacing // spacing between plots in terms of fraction of total plot area
string GraphName // name of the stacked graph
variable mirror // mirror axis on = 1, or off = 0
variable nGraphs
variable nRows
variable nGaps
variable yLength
variable xLength
variable y0, x0, y1, x1
variable i, j, n = 0
string yWave, xWave
string yAxisName, xAxisName, yMirrorName, xMirrorName
// how many graphs are there and how many rows are required
nGraphs = ItemsInList(yWaveList)
nRows = ceil(nGraphs / nCols)
// calculate length of axis from given spacing
nGaps = nCols - 1
xLength = (1 - spacing * nGaps) / nCols
nGaps = nRows - 1
yLength = (1 - spacing * nGaps) / nRows
// Display empty window; kill if it exists
DoWindow/F $GraphName
if(V_flag)
KillWindow $GraphName
endif
Display/K=1 /N= $Graphname
// append traces
for(i=0; i<nRows; i+=1)
// reset vertical axis position
y0 = 0
x1 = 0
for (j=0; j< nCols; j+=1)
// get wave names from lists
yWave = StringFromList(n, yWaveList)
yAxisName = "yAxis" + num2str(n)
xWave = StringFromList(n, xWaveList)
xAxisName = "xAxis" + num2str(n)
if(strlen(xWave) == 0)
// if x-string is empty; plot against wave scaling
AppendToGraph/L=$yAxisName /B=$xAxisName $yWave
else
AppendToGraph/L=$yAxisName /B=$xAxisName $yWave vs $xWave
endif
// set lower left position of y and x axis
ModifyGraph freePos($yAxisName)={y0,kwFraction}
ModifyGraph freePos($xAxisName)={x0,kwFraction}
// set length of the axis
ModifyGraph axisEnab($yAxisName)={y1,(y1+yLength)}
ModifyGraph axisEnab($xAxisName)={x1,(x1+xLength)}
// do some formatting
ModifyGraph tick($yAxisName) = 2, tick($xAxisName) = 2
ModifyGraph btlen($yAxisName) = 4, btlen($xAxisName) = 4
// append mirror axis
if(mirror)
yMirrorName = "yMirror" + num2str(n)
NewFreeAxis/L $yMirrorName
ModifyFreeAxis $yMirrorName master = $yAxisName
ModifyGraph freePos($yMirrorName) ={(y0+xLength), kwFraction}
ModifyGraph axisEnab($yMirrorName) ={y1, (y1+ylength)}
ModifyGraph noLabel($yMirrorName)=2
ModifyGraph tick($yMirrorName) = 0, btlen($yMirrorName) = 4
xMirrorName = "xMirror" + num2str(n)
NewFreeAxis/B $xMirrorName
ModifyFreeAxis $xMirrorName master = $xAxisName
ModifyGraph freePos($xMirrorName) ={(x0+yLength), kwFraction}
ModifyGraph axisEnab($xMirrorName) ={x1, (x1+xlength)}
ModifyGraph noLabel($xMirrorName)=2
ModifyGraph tick($xMirrorName) = 0, btlen($xMirrorName) = 4
endif
// shift next starting positions to the right
y0 += xLength + spacing
x1 += xlength + spacing
// increase plot counter
n += 1
endfor
// shift next starting positions up
x0 += yLength + spacing
y1 += yLength + spacing
endfor
return 1
end
and execute e.g.:
MakeStackedGraph("aa;bb;cc;dd;", ";;;;", 2, 0.1, "Multi", 1)
This uses the wave scaling as values for the x-axis. Alternatively use e.g. the following to create X-Y plots:
MakeStackedGraph("aa;bb;cc;dd;", "aa;aa;aa;aa;", 1, 0.05, "Multi", 0)
Forum
Support
Gallery
Igor Pro 9
Learn More
Igor XOP Toolkit
Learn More
Igor NIDAQ Tools MX
Learn More