How to pass Y variable in Graph Builder from a List in JSL?The example script below does what I need for a fixed small number of parameters which I want to plot on the Y-axis.
How to automate this for a list which is supplied to Y from above?
(The X variable/column remains fixed but the number of elements going to Y can change and is supplied from a another script)
Names Default To Here (1);
Clear Log ();
dt = open("$sample_data\Big Class.jmp");
y_values = {"name", "age", "sex", "weight"};
Graph Builder(
Show Control Panel( 0 ),
Variables( X( :height),
Y( column(dt, y_values[1]) ),
Y( column(dt, y_values[2]) ),
Y( column(dt, y_values[3]) ),
Y( column(dt, y_values[4]) )
),
Elements( Position( 1, 1 ), Points( X, Y, Legend( 1 ) ) ),
Elements( Position( 1, 2 ), Points( X, Y, Legend( 2 ) ) ),
Elements( Position( 1, 3 ), Points( X, Y, Legend( 3 ) ) ),
Elements( Position( 1, 4 ), Points( X, Y, Legend( 4 ) ) )
);Also, how does one handle the Elements () in this case.
Automation and ScriptingWindowsRe: How to pass Y variable in Graph Builder from a List in JSL?@hogi Thanks, I am afraid I need some more hand holding as I have never used Expr () and Insert NameExpr () functions previously. It would be useful if you could provide an example with the example script I added in my OP.
Re: How to pass Y variable in Graph Builder from a List in JSL?This isn't only option of building this but can give some ideas. Also search scripting index for Variable and Element for GraphBuilderbox
Names Default To Here(1);
dt = Open("$sample_data\Big Class.jmp");
y_values = {"name", "age", "sex", "weight"};
variables_expr = Expr(Variables(X(:height)));
For Each({y_col}, y_values,
temp_expr = Expr(Y());
Insert Into(temp_expr, Name Expr(AsColumn(dt, y_col)));
Insert Into(variables_expr, Name Expr(temp_expr));
);
gb_expr = Expr(Graph Builder(
Show Control Panel(0)
));
Insert Into(gb_expr, Name Expr(variables_expr));
For Each({y_col, idx}, y_values,
Eval(EvalExpr(
Insert Into(gb_expr,
Name Expr(Elements(Position(1, Expr(idx)), Points(X, Y, Legend(Expr(idx)))))
)
));
);
Show(Name Expr(gb_expr));
Eval(gb_expr);
Edit:
One example using Add Variable()
Names Default To Here(1);
dt = Open("$sample_data\Big Class.jmp");
y_values = {"name", "age", "sex", "weight"};
variables_expr = Expr(Variables(X(:height)));
gb = dt << Graph Builder(
// Ignore Platform Preferences(1),
Show control Panel(0),
Variables(X(:height))
);
gb << inval;
For Each({y_col, idx}, y_values,
Eval(EvalExpr(
gb << Add Variable({Expr(Name Expr(As Column(dt, y_col))), Role("Y")})
));
// if you just want points, you shouldn't need this, but smoother idx is 2 instead of 1
/* gb << Remove Element(1, idx, 1);
Eval(EvalExpr(
gb << Add Element(1, Expr(idx), {Type("Points"), X, Y, Legend(Expr(idx))})
));
*/
);
gb << Update window;
gb << Remove Element(1, N Items(y_values), 2); // 1 or 2 for smoother idx, depending on how GB is builtRe: How to pass Y variable in Graph Builder from a List in JSL?@jthi Thanks. This works for me, but I cannot change the default Chart title. How to do this via JSL?
Re: How to pass Y variable in Graph Builder from a List in JSL?Depends on what you define as title.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
gb = Graph Builder(
Variables(X(:height), Y(:weight)),
Elements(Points(X, Y), Smoother(X, Y))
);
gb << Title("Test");
And if you consider it to be the text edit box above graph builder, change it manually and then modify the script created by JMP.
SendToReport(Dispatch({}, "graph title", TextEditBox, {Set Text("asdsad")}))
and you can get even more information if you have JMP17 and use properties

So something like
Report(gb)[TextEditBox(1)] << Set Text("12313213");
might work depending on your report
Re: How to pass Y variable in Graph Builder from a List in JSL?@jthi Thanks. For the straightforward case you show, I know how to put the chart title (as you show), but how to do this for the case below?
Names Default To Here(1);
dt = Open("$sample_data\Big Class.jmp");
y_values = {"name", "age", "sex", "weight"};
variables_expr = Expr(Variables(X(:height)));
For Each({y_col}, y_values,
temp_expr = Expr(Y());
Insert Into(temp_expr, Name Expr(AsColumn(dt, y_col)));
Insert Into(variables_expr, Name Expr(temp_expr));
);
gb_expr = Expr(Graph Builder(
Show Control Panel(0)
));
Insert Into(gb_expr, Name Expr(variables_expr));
For Each({y_col, idx}, y_values,
Eval(EvalExpr(
Insert Into(gb_expr,
Name Expr(Elements(Position(1, Expr(idx)), Points(X, Y, Legend(Expr(idx)))))
)
));
);
Show(Name Expr(gb_expr));
Eval(gb_expr);Re: How to pass Y variable in Graph Builder from a List in JSL?Get reference to the graph builder and both of those ideas should work
Re: How to pass Y variable in Graph Builder from a List in JSL?@jthi Thanks but do not see Get Reference () in Scripting Index (I am on JMP 16.2.0). Do you mean get the window name of the graph builder window?
Re: How to pass Y variable in Graph Builder from a List in JSL?Current Report()[TextEditBox( 1 )] << set text( "NewTitle" );
This works for me.
Re: How to pass Y variable in Graph Builder from a List in JSL?I would suggest getting the reference when you evaluate the expression which creates the graph. I think
gb = Eval(gb_expr);
should work. Also it might be a good idea to make sure that Graph Builder is created using dt if there is possibility that multiple tables are open. Though I'm not sure what would be the easiest syntax to do it in this case without testing
Re: How to pass Y variable in Graph Builder from a List in JSL?You could generate symbols var and gb for the expressions
Var= Expr(variables(x(:height)))
gb =Expr(Graph Builder())
And then use InsertInto in a For loop to fill var with the Ys , then insert NameExpr(var) into gb and then use another For loop to add the Elements expressions.