調度到動態生成的堆積圖表大家好,
我嘗試生成一個報告,其中每個“參數”有 2 個圖表,用於中位數和標準差,我正在努力在其中添加線條。
“Summary.jmp”文件包含多個帶有“Lot”的列(我將其用作 X 軸),然後是幾個參數,每個參數都有一個帶有後綴“_Q50”的中位數列和一個帶有後綴“_StdDev”的列.
我有一個參數列表,其中包含 Target、LowerSpecsLimit 和 UpperSpecsLimits(TGT、LSL、USL)。 我沒有將它們直接放在列中,因為它們可以根據我選擇的“批次”集進行更改,實際上我寧願根本不觸摸文件,以確保如果腳本失敗我不會留下一團糟無論出於何種原因。
我也有 Dispatch 來替換標題和軸標籤。
然後我有一個函數可以生成中位數和標準差圖表,圖表很好。
但是無論我在調度部分放什麼,我都會收到錯誤
“在 {} 找不到 ScaleBox ...”
並且所有 TextEditor 調度似乎什麼都不做(甚至沒有錯誤,但我假設函數在第一次調度錯誤時停止?)
我生成了圖表並進行了手動修改以檢查生成的腳本,但沒有幫助。 它直接使用“Param1_Q50”,當我把它放回腳本時,即使這樣也不起作用!
這是代碼:
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")
我什至嘗試用“Param1_Q50”替換 Dispatch 部分中的 medianCol,看看這是否是一個替換問題,期望第一個圖表會得到線條而不是其他圖表,但是......它沒有用!
我也嘗試參考報告
rgb = gb << report;
rgb[TextEditBox(5)] << Set Text("Median");
但我再次收到一條錯誤消息:
Cannot subscript Display Box in access or evaluation of 'Subscript' , rgb[/*###*/"TextEditor"]
有誰知道我如何解決這些圖表的元素?
提前致謝!!
回复:調度到動態生成的堆積圖表
回复:調度到動態生成的堆積圖表嗨,吉姆,
確實,它確實有效!
我手動複製了您的更改,我犯了兩個錯誤:
1. 我沒有意識到“元素”行是強制性的
2. 我寫的是“Parse(title)”而不是title
而且我更喜歡您的解決方案(更清潔的代碼,沒有“殘留物”)。
非常感謝!
回复:調度到動態生成的堆積圖表我在 JMP 12.2 下使用您的匯總表運行了我的腳本,它運行時沒有出現錯誤。 下面是包含您的摘要表的腳本,以及我重新編寫的腳本
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" );回复:調度到動態生成的堆積圖表嗨,吉姆,
我在我的 ref summary.jmp 文件上試過了,然後......
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 )]
所以,如果這是一個錯誤,我應該提到我使用的是 JMP 12.1.0 64 位。
但無論如何,它適用於我的(臟)代碼,所以我會處理它。 我將只有大量的樹形結構窗口要關閉......
回复:調度到動態生成的堆積圖表我想你會發現這個例子是處理你想要的更直接的方法
我不確定最終格式是否完全正確,但我相信您可以輕鬆修改它以滿足您的需求
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" );
回复:調度到動態生成的堆積圖表經過多次嘗試和失敗,我設法做到了(不是很直觀!)
所以,我沒有使用 SendToReport,而是使用了下標。
如果我在函數內部有它,它就不起作用。 我不得不把它拿出來:
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");
還要注意這一行:
rgb << showtreestructure;
如果我沒有它,它就不起作用!
這很煩人,因為我不知道之後如何自動關閉它,但至少,它現在可以工作了!
回复:調度到動態生成的堆積圖表嗨,吉姆,
謝謝! 我做了更正,但它沒有解決我的問題。
在 {} 找不到 ScaleBox["medianCol"]
或者如果我硬編碼它”:
在 {} 中找不到 ScaleBox["Param1_Q50"]
請注意,如果我刪除第二個 Y 軸圖表,那麼參考線會突然起作用,但不會重命名標題和軸。
回复:調度到動態生成的堆積圖表謝謝 - 看起來吉姆已經覆蓋了你
回复:調度到動態生成的堆積圖表嗨大衛,
這是一個summary.jmp。
Re: Dispatch 到動態生成的堆積圖您的限制的數據類型不匹配。 “添加參考線”要求線值(第一個值)必須是數值。 在您的函數中,您將其設置為字符串。
ParamGraph = Function( {parameter, title, tgt = ".", lsl = ".", usl = "."}
在你的 If 語句中
If( tgt != ".",
元素列表需要更改為數字
ParamGraph = Function( {parameter, title, tgt = ".", lsl = ., usl = .}
並且 If 語句需要更改為:
If( IsMissing(tgt) == 0,
Re: Dispatch 到動態生成的堆積圖如果您可以提供我們可以運行的代碼,那麼幫助您會容易得多。 這意味著要么提供表“summary.jmp”,要么重寫代碼以使用 JMP 附帶的示例數據表之一。