Below is the script that produces the output. Everything in the script was actually first created by running JMP interactively and then having JMP kick out the JSL that produced the output step. The only one step that was not produced this way, was the step that normalized the data. That is a piece of JSL that was written from scratch.
names default to here(1);
// Open the data table. In this case it is from the sample data
// distributed with JMP
dt=open("$sample_data/semiconductor capability.jmp");
// For this illustration only use some of the columns
// subset data
varList = {:NPN1, :PNP1, :PNP2, :NPN2, :PNP3, :IVP1, :PNP4, :NPN3, :IVP2, :NPN4, :SIT1,
:INM1, :INM2, :VPM3, :PMS1, :SPM1, :NPN5, :EP2, :ZD6, :PBA, :PLG, :CAP,
:PBA3, :PLG2, :PNP5, :NPN6, :PNP7, :NPN7, :PNP8, :IVP3, :IVP4, :IVP5, :IVP6,
:PNP9, :NPN8, :NPN9, :IVP7, :NPN10, :N_1, :PBA1, :WPR1, :B10, :PLY10,
:VBE210, :VTN210, :VTP210, :SIT2, :SIT3, :INV2, :INV3, :INV4, :INV5, :FST1,
:FST2, :RES1, :RES2, :PNM1, :PPM1, :FNM1, :FPM1, :FST3, :FST4, :RES3, :RES4,
:A1, :B1, :A2N, :A2P, :A2P1, :IVP8, :IVP9, :DE_H1, :NF_H1, :ESM1, :ESM2,
:ESP1, :YFU1, :PBA2, :PBB1, :LYA1, :LYB1, :DEM1, :DEP1, :NFM1, :PLY1, :VDP1,
:VDP2, :SNW1, :RSP2, :PLY2, :RSP1, :VDP3, :PBL1, :PLG1, :VDP4, :SPW1, :VIA1,
:INM3, :VPM5, :INM4, :VPM7, :M1_M1, :M2_M2, :P1_P1, :E2A1, :E2B1, :NPN11,
:IVP10, :PNP10, :INM5, :VPM8, :INM6, :VPM10, :N2A1, :N2B1, :NM_L1, :P2A1,
:P2B1, :PM_L1};
dtSub = dt << subset( columns( eval(varList), selected rows(0)));
// Pass through all of the data to normalize the values
// Normalize the the data by dividing the distance from the target to its value by the size of the
// target - spec limit
For( theCol = 1, theCol <= N Cols( dtSub ), theCol++,
specs = Column( dtSub, Char( varList[theCol] ) ) << get property( "spec limits" );
target = specs["Target"];
lowerSize = -1 * (target - specs["LSL"]);
upperSize = specs["USL"] - target;
For( theRow = 1, theRow <= N Rows( dtSub ), theRow++,
If( Column( dtSub, Char( varList[theCol] ) )[theRow] < target,
Column( dtSub, Char( varList[theCol] ) )[theRow] = (target - Column( dtSub, Char( varList[theCol] ) )[theRow]) / lowerSize,
Column( dtSub, Char( varList[theCol] ) )[theRow] = (Column( dtSub, Char( varList[theCol] ) )[theRow] - target) / upperSize
)
);
);
// Stack the data to put in the form to use Graph Builder for histograms
dtStack = dtSub <<
Stack(
columns(
eval( varList )
),
Source Label Column( "Label" ),
Stacked Data Column( "Data" ));
// Run Graph Builder
dtStack << Graph Builder(
Size( 1032, 464 ),
Show Control Panel( 0 ),
Variables( X( :Label ), Y( :Data ), Overlay( :Label ) ),
Elements( Box Plot( X, Y, Legend( 5 ) ) ),
SendToReport(
Dispatch(
{},
"Data",
ScaleBox,
{Format( "Best", 12 ), Min( -5.34675407881179 ), Max( 6.35855742858709 ),
Inc( 1 ), Minor Ticks( 1 ), Add Ref Line( 1, "Dashed", "Black", "", 1 ),
Add Ref Line( -1, "Dashed", "Black", "", 1 )}
)
)
);
Jim