在“拟合组”中将“双变量”替换为“图形生成器”大家好!
很久以来,我一直有一个脚本,用于在拟合组中绘制双变量图,如下所示:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
Fit Group(
Bivariate( Y(Eval(Y_Parameters) ), X( :age ) ),
<<{Arrange in Rows( 3 )}
);
这里的关键是 - 我以字符串列表的形式获取参数列表,然后逐一绘制它们。
现在我需要从双变量图切换到图形生成器,因为图形生成器具有某些功能而双变量图没有。
我找到了让“图形生成器”的图看起来和“二元”图一模一样的方法,但我不知道是否有像上面那样简单的方法在“拟合组”中绘制边界框。“拟合组”似乎可以像这样绘制边界框:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
Fit Group(
Graph Builder(
Size( 480, 300 ),
Show Control Panel( 0 ),
Variables( X( :age ), Y(Eval(Y_Parameters[1]) ) ),
Elements( Points( X, Y( 1 ), Y( 2 ), Legend( 3 ) ) )
),
Graph Builder(
Size( 480, 300 ),
Show Control Panel( 0 ),
Variables( X( :age ), Y(Eval(Y_Parameters[2]) ) ),
Elements( Points( X, Y( 1 ), Y( 2 ), Legend( 3 ) ) )
),
<<{Arrange in Rows( 3 )}
)
但是对于任意参数列表,我需要在循环中编写脚本。我希望使用更简单的方法,例如(显然行不通):
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
Fit Group(
Graph Builder(
Size( 480, 300 ),
Show Control Panel( 0 ),
Variables( X( :age ), Y(Eval(Y_Parameters) ) ),
Elements( Points( X, Y( 1 ), Y( 2 ), Legend( 3 ) ) )
),
<<{Arrange in Rows( 3 )}
)
GB 有没有什么方法可以获取参数列表并输出 DisplayBox 列表?
自动化和脚本回复:在“拟合组”中用“图形生成器”替换“双变量”你已经非常接近了。你确实需要用循环脚本来编写。下面这个方法似乎可行。你可以用 GUI 输出替换列列表,或者如果你不熟悉 GUI 脚本,甚至可以编写一些脚本来“获取选定的列”,选择要绘制的列,然后以编程方式将其转换为列表。
图形生成器的优势在于交互性。这使得它不太适合在一个窗口上显示多个图表,因为每个图表都需要修改(假设确实需要修改),但脚本可以让它变得简单(差不多)。
我有一个方法是使用一个脚本,它可以输出到多个平台,包括 y by x 和 GB。但它也生成了列切换器。然后有一个按钮可以将列切换器列表中的每个输出绘制到日志中。当然,那里没有交互性。
无论如何,这是稍微修改过的脚本
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
nw = new window("output",
vlb = vlistbox()
);
Y_Parameters = {"height", "weight"} //, "height 2", "weight 2"}; // test for n > 2
nColsNw = 3;
for(i = 1, i<= nitems(Y_Parameters), i++,
if(modulo(i - 1, nColsNw) == 0,
vlb << append(hlb = hlistbox()); //create a new hlb every N columns.
);
hlb << append(
Fit Group(
Graph Builder(
Size( 480, 300 ),
Show Control Panel( 0 ),
Variables( X( :age ), Y(Eval(Y_Parameters[i]) ) ),
Elements( Points( X, Y( 1 ), Y( 2 ), Legend( 3 ) ) )
)//,
// <<{Arrange in Rows( 3 )}
);
);
);
回复:在“拟合组”中用“图形生成器”替换“双变量”对于图形生成器,你实际上可以使用页面来实现类似的效果,但这当然需要你的数据采用特定的格式。或者列切换器。
如果您无法使用页面,我建议您放弃“拟合组”,转而使用“图表生成器”。将图表收集到“行列框”中,以便轻松地按行分组。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Y_Parameters = {"height", "weight"};
nw = New Window("Graph Builder - " || (dt << get name),
ob_group = Outline Box("Fit Group")
);
lub = Lineup Box(N Col(3));
gbs = {};
For Each({yparam}, Y_Parameters,
lub << Append(
Insert Into(gbs, Graph Builder(
Size(480, 300),
Show Control Panel(0),
Variables(X(:age), Y(Eval(Y_Parameters))),
Elements(Points(X, Y(1), Y(2), Legend(3)))
))
);
);
ob_group << Append(lub);
show(gbs);
如果您希望更改每行的报告数量,可以使用 Lineup Box
<< N Col(1);
如果需要,您可以将脚本添加到最高级别的大纲框中。
如果你想使用 Fit Group,你也可以这么做,但这需要一些表达式处理。如果你经常需要这样做,也可以创建一个函数来帮你完成。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
ycols = {"height", "weight"};
fg_expr = Expr(Fit Group());
gb_expr = Expr(dt << Graph Builder(
Size(480, 300),
Show Control Panel(0),
Variables(X(:age), Y(_ycol_)),
Elements(Points(X, Y(1), Y(2), Legend(3)))
));
For Each({ycol}, ycols,
cur_gb_expr = Substitute(Name Expr(gb_expr),
Expr(_ycol_), Name Expr(AsColumn(dt, ycol))
);
Insert Into(fg_expr, Name Expr(cur_gb_expr))
);
fg = Eval(fg_expr);
fg << Arrange in Rows(2);
回复:在“拟合组”中用“图形生成器”替换“双变量”我所面临的限制如下:
此脚本是插件的一部分。目前,它以文本字符串(通过 GUI 生成)中的列列表作为输入。
我不需要交互性,我需要的是与客户商定的精确的情节格式。
我换用GB了,因为“以X拟合Y”似乎不太方便显示误差线。客户突然想在图表上加误差线。
问题在于如何最有效地生成 GB 列表,而不是单个 GB。我希望有一个尚未记录的功能,可以像“Fit Group”和“Fit Y by X”那样实现这一点。
但看起来我必须编写循环脚本。
回复:在“拟合组”中用“图形生成器”替换“双变量”我想我得换用 Line Up Box 了。我本来不想这么做,因为它需要更复杂的代码修改,但我真的不喜欢脚本表达式。我只希望:
1. 我没有在代码中的其他任何地方使用这个 Fit Group 的特定功能
2. 我将能够使它在输出中看起来与 Fit Group 完全一样。
不过,我将展示最终输出的示例代码。
回复:在“拟合组”中用“图形生成器”替换“双变量”问你一个问题。
修复一个明显的拼写错误后,您的脚本运行正常:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Y_Parameters = {"height", "weight"};
nw = New Window("Graph Builder - " || (dt << get name),
ob_group = Outline Box("Fit Group")
);
lub = Lineup Box(N Col(3));
gbs = {};
For Each({yparam}, Y_Parameters,
lub << Append(
Insert Into(gbs, Graph Builder(
Size(480, 300),
Show Control Panel(0),
Variables(X(:age), Y(Eval(yparam))),
Elements(Points(X, Y(1), Y(2), Legend(3)))
))
);
);
ob_group << Append(lub);
show(gbs);
For 'gbs' it shows
{Graph Builder[], Graph Builder[]}
然后就可以完美地附加到“lub”了。
我以稍微不同的形式重写了您建议的第一个脚本:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
X_Parameter = "age";
gbF = Function( {dt, X_parameter, Y_Parameter, groupByColumnString},
groupByColumn = Column( dt, groupByColumnString );
gb = Graph Builder(
Size( 350, 200 ),
Ignore Platform Preferences( 1 ),
Show Control Panel( 0 ),
Variables( X( Column( X_Parameter ) ), Y( Column( Y_Parameter ) ), Overlay( groupByColumn ) ),
);
Return( gb );
);
lub = Lineup Box( N Col( 3 ) );
listOfGBs = {};
For Each( {Y_Parameter, index}, Y_Parameters,
Insert Into( listOfGBs, gbF( dt, X_Parameter, Y_Parameter, "sex" ) )
);
lub << Append( listOfGBs );
ob_group = Outline Box( "Fit Group" );
ob_group << Append( lub );
nw = New Window( "Graph Builder - " || (dt << get name), ob_group = Outline Box( "Fit Group" ) );
在我的例子中,“listOfGBs”也显示为:
{Graph Builder[], Graph Builder[]}
但随后在线上:
lub << Append( listOfGBs );
它会产生错误:
Not a display in access or evaluation of 'Append' , Append( listOfGBs ) /*###*/
at line 25 in ....
知道为什么吗?
我会尝试尝试一下,但我想让 GB 保持功能。
回复:在“拟合组”中用“图形生成器”替换“双变量”一旦我这样做,你的脚本就会停止工作:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Y_Parameters = {"height", "weight"};
nw = New Window("Graph Builder - " || (dt << get name),
ob_group = Outline Box("Fit Group")
);
lub = Lineup Box(N Col(3));
gbs = {};
For Each({yparam}, Y_Parameters,
gb = Graph Builder(
Size(480, 300),
Show Control Panel(0),
Variables(X(:age), Y(Eval(yparam))),
Elements(Points(X, Y(1), Y(2), Legend(3)))
);
lub << Append(
Insert Into(gbs, gb)
);
);
ob_group << Append(lub);
show(gbs);
从语义上来说,直接使用 Graph Builder 表达式和用变量来表示应该没什么区别——这是我的理解。为什么这会破坏脚本?
回复:在“拟合组”中用“图形生成器”替换“双变量”好的,它以这种形式工作:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
X_Parameter = "age";
groupByColumnString = "sex";
gbF = Function( {dt, X_parameter, Y_Parameters, groupByColumnString},
lub = Lineup Box( N Col( 3 ) );
listOfGBs = {};
groupByColumn = Column( dt, groupByColumnString );
For Each( {Y_Parameter, index}, Y_Parameters,
lub << Append(
Insert Into(
listOfGBs,
Graph Builder(
Size( 480, 300 ),
Ignore Platform Preferences( 1 ),
Show Control Panel( 0 ),
Variables(
X( Column( X_Parameter ) ),
Y( Column( Y_Parameter ) ),
Overlay( groupByColumn )
),
)
)
)
);
Return( lub );
);
gbExpr = Expr(
lub = Lineup Box( N Col( 3 ) );
listOfGBs = {};
groupByColumn = Column( dt, groupByColumnString );
For Each( {Y_Parameter, index}, Y_Parameters,
lub << Append(
Insert Into(
listOfGBs,
Graph Builder(
Size( 480, 300 ),
Ignore Platform Preferences( 1 ),
Show Control Panel( 0 ),
Variables(
X( Column( X_Parameter ) ),
Y( Column( Y_Parameter ) ),
Overlay( groupByColumn )
),
)
)
)
);
);
//gbExpr;
lub = gbF(dt, X_parameter, Y_Parameters, groupByColumnString);
ob_group = Outline Box( "Fit Group" );
ob_group << Append( lub );
Show( Type( ob_group ) );
nw = New Window( "Graph Builder - " || (dt << get name), ob_group );
我既可以使用功能(我的方式),也可以使用表达(实际上是你的方式);
我不知道之前的问题是什么,但显然我需要在函数内部创建 LineUp Box 并返回它而不是 GB 对象。
回复:在“拟合组”中用“图形生成器”替换“双变量”您正在向阵容框添加列表,而不是图表构建器。我会将您的脚本修改为类似以下内容:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
X_Parameter = "age";
gbF = Function( {dt, X_parameter, Y_Parameter, groupByColumnString},
groupByColumn = Column( dt, groupByColumnString );
gb = Graph Builder(
Size( 350, 200 ),
Ignore Platform Preferences( 1 ),
Show Control Panel( 0 ),
Variables( X( Column( X_Parameter ) ), Y( Column( Y_Parameter ) ), Overlay( groupByColumn ) ),
);
Return( gb );
);
lub = Lineup Box( N Col( 3 ) );
listOfGBs = {};
For Each( {Y_Parameter, index}, Y_Parameters,
lub << Append(Insert Into(listOfGBs, gbF(dt, X_Parameter, Y_Parameter, "sex" )));
);
ob_group = Outline Box( "Fit Group" );
ob_group << Append( lub );
nw = New Window( "Graph Builder - " || (dt << get name), ob_group);
创建图表时需要稍微小心一些。如果您开始尝试使用表达式,通常可以避免这种情况,但这需要您自行构建。此外,如果您不需要收集引用,那么创建图表会稍微容易一些,因为您不需要“插入”。您可以稍后使用 << XPath 获取它们。
查看更多...
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Y_Parameters = {"height", "weight"};
X_Parameter = "age";
gbF = Function({dt, X_parameter, Y_Parameter, groupByColumnString},
groupByColumn = Column(dt, groupByColumnString);
gb = Graph Builder(
Size(350, 200),
Ignore Platform Preferences(1),
Show Control Panel(0),
Variables(X(Column(X_Parameter)), Y(Column(Y_Parameter)), Overlay(groupByColumn)),
);
Return(gb);
);
lub = Lineup Box(N Col(3));
For Each( {Y_Parameter, index}, Y_Parameters,
lub << Append(gbF(dt, X_Parameter, Y_Parameter, "sex" ));
);
ob_group = Outline Box("Fit Group");
ob_group << Append(lub);
nw = New Window("Graph Builder - " || (dt << get name), ob_group);
gbs = (ob_group << XPath("//OutlineBox[@helpKey='Graph Builder']")) << Get Scriptable Object;