Versand an dynamisch generierte StapeldiagrammeHallo alle,
Ich versuche, einen Bericht zu erstellen, in dem ich 2 Diagramme pro "Parameter" für Median und stdev habe, und ich habe Probleme, Zeilen hinzuzufügen.
Die Datei „Summary.jmp“ enthält mehrere Spalten mit einem „Lot“ (ich verwende es als X-Achse) und dann mehrere Parameter, von denen jeder eine Spalte für den Median mit dem Suffix „_Q50“ und eine mit dem Suffix „_StdDev“ hat. .
Ich habe eine Liste von Parametern, die zusätzlich Target, LowerSpecsLimit und UpperSpecsLimits (TGT, LSL, USL) haben. Ich habe sie nicht direkt in den Spalten, da sie sich basierend auf dem von mir ausgewählten "Lot" -Set ändern können, und ich würde es vorziehen, die Datei überhaupt nicht zu berühren, um sicherzustellen, dass ich kein Chaos hinterlasse, wenn das Skript fehlschlägt warum auch immer.
Ich habe auch Dispatch, um die Titel und Achsenbeschriftungen zu ersetzen.
Ich habe dann eine Funktion, die die Median- und stdev-Diagramme übereinander generiert, Diagramme sind in Ordnung.
Aber egal was ich in den Dispatch-Bereich eingebe, ich erhalte eine Fehlermeldung
"Kann ScaleBox nicht finden ... bei {}"
und der gesamte TextEditor-Versand scheint nichts zu tun (nicht einmal ein Fehler, aber ich nehme an, die Funktion stoppt beim ersten Versandfehler?)
Ich habe die Diagramme generiert und manuelle Änderungen vorgenommen, um das resultierende Skript zu überprüfen, und es hat nicht geholfen. Es verwendet "Param1_Q50" direkt, und selbst das funktioniert nicht, wenn ich es wieder in das Skript einfüge!
Hier ist der Code:
NamesDefaultToHere(1);
Open("Summary.jmp");
GraphXSize = 800;
GraphYSize = 600;
ParamsList = {
{"Param1", "Name1", 0, -10, 10},
{"Param2", "Name2", 50, 25, 75}
};
ParamGraph = Function (
{parameter, title, tgt=".", lsl=".", usl="."},
LOCAL(
{Default Local},
medianCol = parameter || "_Q50";
stdevCol = parameter || "_StdDev";
gb = Graph Builder(
Size(GraphXSize,GraphYSize),
Show Control Panel(0),
Show Footer(0),
Show Legend(0),
Variables(
X(:Name("Lot")),
Y(Column(medianCol)),
Y(Column(stdevCol)),
Color(:Lot)
),
Elements(
Points(X, Y, Legend(6))
),
SendToReport(
Dispatch(
{},
medianCol,
ScaleBox,
{IF(tgt != ".", Add Ref Line(tgt, "Solid", "Black", "TARGET", 1)),
IF(lsl != ".", Add Ref Line(lsl, "Solid", "Purple", "LSL", 1)),
IF(usl != ".", Add Ref Line(usl, "Solid", "Red", "USL", 1))}
),
Dispatch({}, "graph title", TextEditor, {Set Text(title)}),
Dispatch({}, "Y title", TextEditor, {Set Text("Median")}),
Dispatch({}, "Y 1 title", TextEditor, {Set Text("Std Dev")})
),
);
);
);
New Window("Summary - Report",
For(i=1, i<=Length(ParamsList), i++,
ParamGraph(ParamsList[i][1], ParamsList[i][2], ParamsList[i][3], ParamsList[i][4], ParamsList[i][5])
)
) << Set Window Icon("Trellis")
Ich habe sogar versucht, medianCol im Abschnitt „Dispatch“ durch „Param1_Q50“ zu ersetzen, um zu sehen, ob es sich um ein Ersetzungsproblem handelt, da ich erwartet hatte, dass das erste Diagramm die Linien erhalten würde und nicht die anderen, aber … es hat nicht funktioniert!
Ich habe auch versucht, auf den Bericht Bezug zu nehmen
rgb = gb << report;
rgb[TextEditBox(5)] << Set Text("Median");
Aber ich bekomme wieder eine Fehlermeldung:
Cannot subscript Display Box in access or evaluation of 'Subscript' , rgb[/*###*/"TextEditor"]
Weiß jemand, wie ich die Elemente dieser Diagramme ansprechen kann?
Danke im Voraus!!
Betreff: Versand an dynamisch generierte Stapeldiagramme
Betreff: Versand an dynamisch generierte StapeldiagrammeHallo Jim,
In der Tat, es funktioniert!
Ich habe Ihre Änderungen manuell kopiert und zwei Fehler gemacht:
1. Ich wusste nicht, dass die „Element“-Zeilen obligatorisch sind
2. Ich habe "Parse(title)" anstelle von title geschrieben
Und ich bevorzuge Ihre Lösung (sauberer Code und keine "Rückstände").
Vielen Dank!
Betreff: Versand an dynamisch generierte StapeldiagrammeIch habe mein Skript mit Ihrer Übersichtstabelle unter JMP 12.2 ausgeführt und es wurde ohne Fehler ausgeführt. Unten ist das Skript, das Ihre Übersichtstabelle und mein überarbeitetes Skript enthält
Names Default To Here( 1 );
//Open("Summary.jmp");
dtsumm = New Table( "Summary",
Add Rows( 6 ),
New Column( "Lot",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [1, 2, 3, 4, 5, 6] )
),
New Column( "Param1_Q50",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [-3, 7, 8, -12, 5, 0] )
),
New Column( "Param1_StdDev",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [0.2, 1, 0.6, 2, 0.2, 0.3] )
),
New Column( "Param2_Q50",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [23, 18, 54, 62, 78, 45] )
),
New Column( "Param2_StdDev",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [0.9, 1.2, 7, 3.6, 4.2, 1] )
)
);
// Run the script
GraphXSize = 800;
GraphYSize = 600;
ParamsList = {{"Param1", "Name1", 0, -10, 10},
{"Param2", "Name2", 50, 25, 75}};
ParamGraph = Function( {parameter, title, tgt = ., lsl = ., usl = .},
Local( {Default Local},
medianCol = parameter || "_Q50";
stdevCol = parameter || "_StdDev";
Eval(
Substitute(
Expr(
gb = dtSumm << Graph Builder(
Size( __GraphXSize__, __GraphYSize__ ),
Show Control Panel( 0 ),
Show Legend( 0 ),
Show Footer( 0 ),
Variables( X( :lot ), Y( __Q50__ ), Y( __Std__ ), Color( :lot ) ),
Elements( Position( 1, 1 ), Points( X, Y, Legend( 6 ) ) ),
Elements( Position( 1, 2 ), Points( X, Y, Legend( 7 ) ) ),
SendToReport(
Dispatch( {}, "graph title", TextEditBox, {Set Text( __title__ )} ),
Dispatch( {}, "Y title", TextEditBox, {Set Text( "Median" )} ),
Dispatch( {}, "Y 1 title", TextEditBox, {Set Text( "Std Dev" )} )
)
)
),
Expr( __GraphXSize__ ), GraphXSize,
Expr( __GraphYSize__ ), GraphYSize,
Expr( __Q50__ ), Parse( MedianCol ),
Expr( __Std__ ), Parse( stdevCol ),
Expr( __Title__ ), title
)
);
If( Is Missing( tgt ) == 0,
report(gb)[AxisBox( 3 )] << Add Ref Line( tgt, "Solid", Black, "TARGET", 1 )
);
If( Is Missing( lsl ) == 0,
report(gb)[AxisBox( 3 )] << Add Ref Line( lsl, "Solid", Purple, "LSL", 1 )
);
If( Is Missing( usl ) == 0,
report(gb)[AxisBox( 3 )] << Add Ref Line( usl, "Solid", Red, "USL", 1 )
);
)
);
New Window( "Summary - Report",
For( i = 1, i <= Length( ParamsList ), i++,
ParamGraph( ParamsList[i][1], ParamsList[i][2], ParamsList[i][3], ParamsList[i][4], ParamsList[i][5] )
)
) << Set Window Icon( "Trellis" );Betreff: Versand an dynamisch generierte StapeldiagrammeHallo Jim,
Ich habe es mit meiner ref summary.jmp-Datei versucht und ...
Cannot find TextEditBox[ "graph title" ] at {}
Cannot find TextEditBox[ "Y title" ] at {}
Cannot find TextEditBox[ "Y 1 title" ] at {}
Cannot subscript Display Box in access or evaluation of 'Subscript' , Report( gb )[/*###*/AxisBox( 3 )]
Wenn dies also ein Fehler ist, sollte ich erwähnen, dass ich auf JMP 12.1.0 64bit bin.
Aber wie auch immer, es funktioniert mit meinem (schmutzigen) Code, also werde ich mich damit befassen. Ich muss nur eine Menge Baumstrukturfenster schließen ...
Betreff: Versand an dynamisch generierte StapeldiagrammeIch denke, Sie werden feststellen, dass dieses Beispiel eine direktere Art ist, mit dem umzugehen, was Sie wollen
Ich bin mir nicht sicher, ob das endgültige Format genau richtig ist, aber ich glaube, Sie können es leicht an Ihre Bedürfnisse anpassen
Names Default To Here( 1 );
//Open("Summary.jmp");
// Create a Sample data table
dt = Open( "$SAMPLE_DATA\semiconductor capability.jmp" );
dt:npn1 << delete property( "spec limits" );
dt:pnp1 << delete property( "spec limits" );
dt:npn1 << set name( "Param1" );
dt:pnp1 << set name( "Param2" );
dt:lot_id << set name( "lot" );
dtSumm = dt << Summary(
Group( :lot ),
Median( :Param1 ),
Std Dev( :Param1 ),
Median( :Param2 ),
Std Dev( :Param2 ),
Freq( "None" ),
Weight( "None" ),
statistics column name format( "column stat" )
);
dtSumm:Param1 Median << set name( "Param1_Q50" );
dtSumm:Param2 Median << set name( "Param2_Q50" );
dtSumm:Param1 Std Dev << set name( "Param1_StdDev" );
dtSumm:Param2 Std Dev << set name( "Param2_StdDev" );
// Run the script
GraphXSize = 800;
GraphYSize = 600;
ParamsList = {{"Param1", "Name1", 0, -10, 10},
{"Param2", "Name2", 50, 25, 75}};
ParamGraph = Function( {parameter, title, tgt = ., lsl = ., usl = .},
Local( {Default Local},
medianCol = parameter || "_Q50";
stdevCol = parameter || "_StdDev";
Eval(
Substitute(
Expr(
gb = dtSumm << Graph Builder(
Size( __GraphXSize__, __GraphYSize__ ),
Show Control Panel( 0 ),
Show Legend( 0 ),
Show Footer( 0 ),
Variables( X( :lot ), Y( __Q50__ ), Y( __Std__ ), Color( :lot ) ),
Elements( Position( 1, 1 ), Points( X, Y, Legend( 6 ) ) ),
Elements( Position( 1, 2 ), Points( X, Y, Legend( 7 ) ) ),
SendToReport(
Dispatch( {}, "graph title", TextEditBox, {Set Text( __title__ )} ),
Dispatch( {}, "Y title", TextEditBox, {Set Text( "Median" )} ),
Dispatch( {}, "Y 1 title", TextEditBox, {Set Text( "Std Dev" )} )
)
)
),
Expr( __GraphXSize__ ), GraphXSize,
Expr( __GraphYSize__ ), GraphYSize,
Expr( __Q50__ ), Parse( MedianCol ),
Expr( __Std__ ), Parse( stdevCol ),
Expr( __Title__ ), title
)
);
If( Is Missing( tgt ) == 0,
report(gb)[AxisBox( 3 )] << Add Ref Line( tgt, "Solid", Black, "TARGET", 1 )
);
If( Is Missing( lsl ) == 0,
report(gb)[AxisBox( 3 )] << Add Ref Line( lsl, "Solid", Purple, "LSL", 1 )
);
If( Is Missing( usl ) == 0,
report(gb)[AxisBox( 3 )] << Add Ref Line( usl, "Solid", Red, "USL", 1 )
);
)
);
New Window( "Summary - Report",
For( i = 1, i <= Length( ParamsList ), i++,
ParamGraph( ParamsList[i][1], ParamsList[i][2], ParamsList[i][3], ParamsList[i][4], ParamsList[i][5] )
)
) << Set Window Icon( "Trellis" );
Betreff: Versand an dynamisch generierte StapeldiagrammeNach vielen Versuchen und Fehlschlägen habe ich es geschafft (nicht sehr intuitiv!)
Also habe ich SendToReport nicht verwendet, aber ich habe Abonnements verwendet.
Wenn ich es in der Funktion habe, funktioniert es nicht. Ich musste es rausnehmen:
NamesDefaultToHere(1);
Open("Summary.jmp");
GraphXSize = 800;
GraphYSize = 600;
ParamsList = {
{"Param1", "Name1", 0, -10, 10},
{"Param2", "Name2", 50, 25, 75}
};
ParamGraph = Function (
{parameter, title, tgt=., lsl=., usl=.},
LOCAL(
{Default Local},
medianCol = parameter || "_Q50";
stdevCol = parameter || "_StdDev";
return = Graph Builder(
Size(GraphXSize,GraphYSize),
Show Control Panel(0),
Show Footer(0),
Show Legend(0),
Variables(
X(:Name("Lot")),
Y(Column(medianCol)),
Y(Column(stdevCol)),
Color(:Lot)
),
Elements(
Points(X, Y, Legend(6))
)
);
);
);
wind = New Window("Summary - Report",
For(i=1, i<=Length(ParamsList), i++,
gb= ParamGraph(ParamsList[i][1], ParamsList[i][2], ParamsList[i][3], ParamsList[i][4], ParamsList[i][5]);
rgb = gb << report;
rgb << showtreestructure;
IF(
IsMissing(ParamsList[i][3]) == 0,
rgb[PictureBox(1), GraphBuilderBox(1), GraphBuilderAxisBox(2)] << Add Ref Line(ParamsList[i][3], "Solid", "Black", "TARGET", 1);
);
IF(
IsMissing(ParamsList[i][4]) == 0,
rgb[PictureBox(1), GraphBuilderBox(1), GraphBuilderAxisBox(2)] << Add Ref Line(ParamsList[i][4], "Solid", "Purple", "LSL", 1);
);
IF(
IsMissing(ParamsList[i][5]) == 0,
rgb[PictureBox(1), GraphBuilderBox(1), GraphBuilderAxisBox(2)] << Add Ref Line(ParamsList[i][5], "Solid", "Red", "USL", 1);
);
rgb[PictureBox(1), GraphBuilderBox(1), GraphBuilderTitleBox(1)] << Set Text(ParamsList[i][2]);
rgb[PictureBox(1), GraphBuilderBox(1), GraphBuilderTitleBox(3)] << Set Text ("Median");
rgb[PictureBox(1), GraphBuilderBox(1), GraphBuilderTitleBox(4)] << Set Text ("Standard Deviation");
)
) << Set Window Icon("Trellis");
Beachten Sie auch die Zeile:
rgb << showtreestructure;
Wenn ich es nicht habe, funktioniert es nicht!
Und das ist ziemlich nervig, da ich nicht weiß, wie ich es danach automatisch schließen kann, aber zumindest funktioniert es jetzt!
Betreff: Versand an dynamisch generierte StapeldiagrammeHallo Jim,
Vielen Dank! Ich habe die Korrektur vorgenommen, aber sie hat mein Problem nicht behoben.
Kann ScaleBox["medianCol"] bei {} nicht finden
oder wenn ich es fest codiere:
Kann ScaleBox["Param1_Q50"] bei {} nicht finden
Beachten Sie, dass, wenn ich das zweite Y-Achsendiagramm entferne, plötzlich die Ref-Linien funktionieren, aber nicht die Umbenennung von Titeln und Achsen.
Betreff: Versand an dynamisch generierte StapeldiagrammeDanke - sieht so aus, als hätte Jim Sie abgedeckt
Betreff: Versand an dynamisch generierte StapeldiagrammeHallo David,
Hier ist eine Zusammenfassung.jmp.
Betreff: Versand an dynamisch generierte StapeldiagrammeDie Datentypen für Ihre Limits stimmen nicht überein. „Referenzzeile hinzufügen“ erfordert, dass der Zeilenwert (erster Wert) ein numerischer Wert sein muss. In Ihrer Funktion setzen Sie es auf eine Zeichenfolge.
ParamGraph = Function( {parameter, title, tgt = ".", lsl = ".", usl = "."}
und in Ihrer If-Anweisung
If( tgt != ".",
Die Elementliste muss auf numerisch geändert werden
ParamGraph = Function( {parameter, title, tgt = ".", lsl = ., usl = .}
und die If-Anweisung muss geändert werden in:
If( IsMissing(tgt) == 0,
Betreff: Versand an dynamisch generierte StapeldiagrammeEs wäre viel einfacher, Ihnen zu helfen, wenn Sie uns Code zur Verfügung stellen könnten, den wir ausführen können. Das bedeutet, entweder die Tabelle „summary.jmp“ bereitzustellen oder den Code so umzuschreiben, dass er mit einer der Beispieldatentabellen funktioniert, die mit JMP geliefert werden.