结合解决方案我和@txnelson之前提供,您应该能够修改点/平滑等。 首先使用 JMP 创建图形(不需要在 y 轴上包含所有列,您可以只使用两个)。 我将介绍如何开发这个脚本的过程(这会有点长):
1. 打开 JMP 样本数据。 在这种情况下,我知道 Semiconductor Capability.jmp 有很多列
2. 在图表生成器中创建一个图表,其中某列作为 X 轴,两列作为 Y 轴

拿剧本
Graph Builder(
Variables(X(:lot_id), Y(:NPN1), Y(:PNP1, Position(1))),
Elements(Points(X, Y(1), Y(2), Legend(3)))
)
3. 将点更改为线,我还将从默认值更改摘要统计,所以我可以看到如何在脚本中更改

拿脚本
Graph Builder(
Variables(X(:lot_id), Y(:NPN1), Y(:PNP1, Position(1))),
Elements(Line(X, Y(1), Y(2), Legend(4), Summary Statistic("Median")))
)
4. 现在我有很好的基线脚本可以开始处理这个了。 因为我知道Re: 你能在不写字符串的情况下构造它吗?可以用来解决这个问题,我用它作为我的基线(我之前提供的脚本)。
带基本图:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
x_col = Column(dt, 1);
y_cols = (dt << Get Column Names())[5::N Cols(dt)];
var_expr = EvalExpr(
Variables(X(Expr(x_col))
));
For Each({col}, y_cols,
y_expr = Expr(Y(Position(1)));
Insert Into(y_expr, NameExpr(col), 1);
Insert Into(var_expr, Name Expr(y_expr));
);
gb = Eval(Substitute(
Expr(
gb = dt << Graph Builder(
Size(838, 391),
Show Control Panel(0),
vvv,
)
),
Expr(vvv), Name Expr(var_expr),
));
gb_image = gb << get picture;
gb << Close Window;
New window("test",
gb_image
);
现在,如果我想要 Line 而不是点,我会检查 JMP 早些时候给我的“线”脚本中我必须更改的内容。 基本上我需要添加元素。
Elements(Line(X, Y(1), Y(2), Legend(4), Summary Statistic("Median")))
幸运的是,这些已添加到另一篇文章中
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
x_col = Column(dt, 1);
y_cols = (dt << Get Column Names())[5::N Cols(dt)];
var_expr = EvalExpr(
Variables(X(Expr(x_col))
));
var_line = Expr(Line(X));
For Each({col, idx}, y_cols,
y_expr = Expr(Y(Position(1)));
Insert Into(y_expr, NameExpr(col), 1);
Insert Into(var_expr, Name Expr(y_expr));
yline_expr = Parse("Y("||char(idx)||")");
Insert Into(var_line, Name Expr(yline_expr));
);
gb = Eval(Substitute(
Expr(
gb = dt << Graph Builder(
Size(838, 391),
Show Control Panel(0),
vvv,
Elements(yyy)
)
),
Expr(vvv), Name Expr(var_expr),
Expr(yyy), Name Expr(var_line)
));
gb_image = gb << get picture;
gb << Close Window;
New window("test",
gb_image
);

(我没有更改汇总统计信息,但通过在创建图形构建器之前向 var_line 插入更多表达式来更改它们应该相当容易)
yline_expr = Expr(Legend(6));<BR />Insert Into(var_line, Name Expr(yline_expr));<BR />yline_expr = Expr(Summary Statistic("Median"));<BR />Insert Into(var_line, Name Expr(yline_expr));<BR />
知道如何使用 Expr、Substitute、NameExpr 等我是通过社区的这几篇帖子学到的使用 Eval Insert、Eval Expr、Parse 和 Substitute 将一个表达式插入另一个表达式,表达式处理函数:第一部分 - 解开 Expr()、NameExpr()、Eval()、... 难题并且有很多很多的试验和错误(我仍然对它们感到困惑,尤其是 Name Expr)
最后,如果我要将此脚本与您拥有的脚本结合起来(我会清理更多,更改表达式的顺序,最有可能预填充列选择器,并且可能提供选择要使用的图形类型的选项,但这应该给出一个主意):
查看更多...
Names Default To Here(1);
//the data table you want to operate on
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
//number of columns in the data table
numcol = N Col(dt);
selectorwindow = New Window("Column Selector",
<<MODAL></MODAL>
听起来好像您是从头开始生成 JSL ......就像 Python 程序员会做的那样,而不是使用您生成的交互式 Graph Builder,然后让 JMP 生成将创建图形的 JSL。如果我以交互方式创建下图,

通过转到红色三角形并选择“脚本”,它会生成一个处理两个 Y 轴变量的脚本
Graph Builder(
Size( 528, 448 ),
Show Control Panel( 0 ),
Variables( X( :age ), Y( :height ), Y( :weight, Position( 1 ) ) ),
Elements(
Points( X, Y( 1 ), Y( 2 ), Legend( 5 ) ),
Smoother( X, Y( 1 ), Y( 2 ), Legend( 6 ) )
),
SendToReport(
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
5,
Base( 0, 0, 0, Item ID( "height", 1 ) ),
Base( 1, 0, 0, Item ID( "weight", 1 ) )
)}
)
)
);
现在,如果您的问题是,当您使用上述脚本并尝试扩展它以处理所需数量的 Y 列时,有时可能需要更多的工作。
这是图的相同结构,但有更多的 Y 列

这是 JMP 为重新创建图形而生成的扩展 JSL
Graph Builder(
Size( 528, 458 ),
Show Control Panel( 0 ),
Variables(
X( :Wafer ID in lot ID ),
Y( :NPN1 ),
Y( :PNP1, Position( 1 ) ),
Y( :PNP2, Position( 1 ) ),
Y( :NPN2, Position( 1 ) ),
Y( :PNP3, Position( 1 ) ),
Y( :IVP1, Position( 1 ) ),
Y( :PNP4, Position( 1 ) )
),
Elements(
Points(
X,
Y( 1 ),
Y( 2 ),
Y( 3 ),
Y( 4 ),
Y( 5 ),
Y( 6 ),
Y( 7 ),
Legend( 3 )
),
Smoother(
X,
Y( 1 ),
Y( 2 ),
Y( 3 ),
Y( 4 ),
Y( 5 ),
Y( 6 ),
Y( 7 ),
Legend( 4 )
)
),
SendToReport(
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
3,
Base( 0, 0, 0, Item ID( "NPN1", 1 ) ),
Base( 1, 0, 0, Item ID( "PNP1", 1 ) ),
Base( 2, 0, 0, Item ID( "PNP2", 1 ) ),
Base( 3, 0, 0, Item ID( "NPN2", 1 ) ),
Base( 4, 0, 0, Item ID( "PNP3", 1 ) ),
Base( 5, 0, 0, Item ID( "IVP1", 1 ) ),
Base( 6, 0, 0, Item ID( "PNP4", 1 ) )
)}
)
)
);
Graph Builder(
Size( 528, 458 ),
Show Control Panel( 0 ),
Variables(
X( :Wafer ID in lot ID ),
Y( :NPN1 ),
Y( :PNP1, Position( 1 ) ),
Y( :PNP2, Position( 1 ) ),
Y( :NPN2, Position( 1 ) ),
Y( :PNP3, Position( 1 ) ),
Y( :IVP1, Position( 1 ) ),
Y( :PNP4, Position( 1 ) )
),
Elements(
Points(
X,
Y( 1 ),
Y( 2 ),
Y( 3 ),
Y( 4 ),
Y( 5 ),
Y( 6 ),
Y( 7 ),
Legend( 3 )
),
Smoother(
X,
Y( 1 ),
Y( 2 ),
Y( 3 ),
Y( 4 ),
Y( 5 ),
Y( 6 ),
Y( 7 ),
Legend( 4 )
)
),
SendToReport(
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
3,
Base( 0, 0, 0, Item ID( "NPN1", 1 ) ),
Base( 1, 0, 0, Item ID( "PNP1", 1 ) ),
Base( 2, 0, 0, Item ID( "PNP2", 1 ) ),
Base( 3, 0, 0, Item ID( "NPN2", 1 ) ),
Base( 4, 0, 0, Item ID( "PNP3", 1 ) ),
Base( 5, 0, 0, Item ID( "IVP1", 1 ) ),
Base( 6, 0, 0, Item ID( "PNP4", 1 ) )
)}
)
)
);
这是 JSL 程序员必须创建要执行的命令字符串以传递给 Graph Builder 的地方。如果您已经这样做了,并且您只获得了图中的第一个 Y 变量,那么通常发生的情况是 Graph Builder 无法评估传递给它的信息。如果您提供您正在使用的 JSL,社区通常很擅长提供帮助。