你好,
我发现为图形生成器编写脚本是一种残酷的经历(我编写 JMP 脚本已经有一段时间了)。 它似乎不直观,我似乎也找不到我需要的具体帮助。 所以我挥舞着我的白旗并向小组询问。
我的脚本获取正确的列(数量有所不同)并正确创建一个具有两个嵌套 X 级别的图形生成器。 问题是,虽然我给出的第一个变量是正确的点,但由于某种原因,图形生成器将箱形图分配给每个其他变量(在我的脚本中看不到)。 因此,我正在寻找一种简单的方法将所有 y 变量转换为点。 我怀疑它涉及循环遍历 Elements,但如果我能找到正确的方法,我就该死了。
想法? 另外,有人对图形生成器的详细脚本有很好的参考吗?
蒂亚! 弗雷德
是的。 我同意。 这也是我学习它的方法,但相对于其他脚本来说,它令人惊讶地令人沮丧。 一个进行更多讨论的成熟领域!
谢谢您的帮助。 我采取了以下方法(通过迭代......很多失败!):
1. 我有一个要放入图表中的列名称列表。 它位于列表“a”(未显示)中。 这就是我想要绘制的。
2. 我根据与我的搜索列表匹配的数据表列构建一个列表。 这些是我可以绘制的存在的 Y 轴变量。
3. 我构建了一个图形生成器,并使用嵌套变量设置 X 轴。 这对于我的所有数据来说都很常见。
4. 然后循环并添加变量。
5. 然后我循环并添加元素。
6. 然后我循环并添加网格线。 最后是标题。
对于步骤 4-6,如果我尝试在单个循环中执行这些操作,JMP 就会不断崩溃。 我就是这样走到这一步的。 该脚本可以工作(必须提取一些小的机密内容),但速度不快。
与我编写的其他 JSL 相比,这相当笨拙。 我从来没有遇到过这么多 JMP 崩溃的情况。 但它有效。
dtname = dt << Get Name();
currentTime = Today();
timeString = "Last Updated " || Format( currentTime, "mm-dd-yyyy" ) ;
// Find columns that match the terms in list "a"
col = dt << get column names( string );
nc = N Items( col );
nsrch = N Items( a );
xxx = {};
For( j = 1, j <= nsrch, j++,
For( i = 1, i <= nc, i++,
If( Uppercase( col[i] ) == Uppercase( a[j] ),
Insert Into( xxx, col[i] ),
)
)
);
colList = xxx;
//Build Basic Chart with nested X variables, no Y variables (yet)
gb = dt << Graph Builder(
Size( 1226, 608 ),
Show Control Panel( 0 ),
Show Legend( 0 ),
Show Subtitle( 1 ),
Variables(
X( :XVar1, Combine( "Nested" ) ),
X( :XVar2, Position( 1 ), Combine( "Nested" ) ),
X( :XVar3, Position( 1 ), Combine( "Nested" ) ),
),
);
gbb = Report( gb )[Graph Builder Box( 1 )];
// I don't know why I have to break these into separate loops, but I tried not to....
// I think it's something to do with needing the "wait".
//Add Y variables.
For( i = 1, i <= N Items( colList ), i++,
gbb << Add Variable( {colList[i], Role( "Y" )} );
If( i == 1,
chrtname = colList[i],
chrtname = chrtname || ", " || colList[i]
);
);
Wait( 1 );
//Remove existing element and replace with points.
For( i = 1, i <= N Items( colList ), i++,
gbb << Remove Element( 1, i, 1 );
gbb << Add Element( 1, i, {Type( "Points" ), X, Y} );
);
Wait( 1 );
For( i = 1, i <= N Items( colList ), i++,
gbb << Add Element( 1, i, {Type( "Line" ), X, Y} )
);
//Set Major Axes
For( i = 1, i <= N Items( colList ), i++,
gbb << Dispatch( {}, colList[i], ScaleBox, {Label Row( Show Major Grid( 1 ) )} ),
);
//Set Various Titles
gb << SendToReport( Dispatch( {}, "graph 1 title", TextEditBox, {Set Text( timeString )} ) );
gb << SendToReport( Dispatch( {}, "Graph Builder", OutlineBox, {Set Title( chrtname || " from " || dtname ), Image Export Display( Normal )} ) );
gb << SendToReport(
Dispatch(
{},
"XVar1",
ScaleBox,
{Label Row( 2, {Major Grid Line Color( 3 ), Show Major Grid( 1 )} ), Label Row( 3, {Major Grid Line Color( 5 ), Show Major Grid( 1 )} )}
)
);
);Graph Builder JSL 脚本不容易理解。我的方法是根据自己的喜好调整图表,然后单击红色三角形并获取生成的脚本。
但是,如果您有动态数量的 Y 变量,您可以获得 2 或 3 个 Y 变量的脚本,并研究 GB 脚本的模式。然后将其扩展到n Y 变量,您将动态构建一个包含要执行的 gb 脚本的字符串,然后使用 eval(parse(gb_string)) 运行它。
这是使用表达式的一种方法。 在这种情况下,我喜欢这种方法,因为我拥有完全的控制权,并且可以一次性完成整个启动表达式。
Names Default to Here( 1 );
// open example data
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
// a list of columns to plot in Y role was previously created somehow
col = List( :height, :weight );
nc = N Items( col );
// create expression for Variables launch argument with first column,
// using same two nested X variables
vars arg = Eval Expr(
Variables(
X( :age ),
X( :sex, Position( 1 ) ),
Y( Expr( col[1] ) )
)
);
// create expression for Points launch argument with first column
points arg = Eval Expr(
Points( X( 1 ), X( 2 ), Y( 1 ) )
);
// add remaining columns in the Y role
If( nc > 1,
For( c = 2, c <= nc, c++,
Insert Into( vars arg, Eval Expr( Y( Expr( col[c] ), Position( 1 ) ) ) );
Insert Into( points arg, Eval Expr( Y( Expr( c ) ) ) );
);
);
// finish GB launch expression
gb expr = Substitute(
Expr(
Graph Builder(
Size( 534, 464 ),
Show Control Panel( 0 ),
vvv,
Elements( ppp )
)
),
Expr( vvv ), Name Expr( vars arg ),
Expr( ppp ), Name Expr( points arg )
);
Eval( gb expr );
我意识到这个答案并不是一个完整的解决方案。 您没有提供足够的信息来尝试解决方案。 另外,您最好学习如何自己解决它。 它旨在说明一种可能适合您的方法。
您是否以 Y 角色绘制多列或使用多个图形生成器对象(每一列一个)?
好吧,找到了一些解决办法,但它肯定不稳定。
我结束了:
- 使用我想要的嵌套 x 变量制作初始图,但没有 Y 变量。
- 然后我运行一个循环来添加 Y 变量。
- 然后,我添加另一个循环来删除每个 Y 的元素,并为每个有点的 Y 添加一个新元素。
- 然后我添加另一个循环来为每个 Y 添加网格线。
几乎每个步骤之间都有一个 Wait(1)。 我最初尝试为每个变量使用一个循环来完成每件事,到目前为止,我在某个地方使 JMP Complete 崩溃了大约 10 次。 正是我的故障排除让我看到了上面的表格。
所以,它可以工作,但我肯定不喜欢如果编码不正确,JMP 就会崩溃。 我仍然希望有人为我提供有关图形生成器脚本的可靠参考。 提前致谢!弗雷德