cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
Check out the JMP® Marketplace featured Capability Explorer add-in
Choose Language Hide Translation Bar
ac7872
Level II

Using expressions for theme format

I am trying to make the formatting of multiple similar plots into an expression so I can change a single section of the code to update all plots that look alike. However, I have a hard time implementing it into code. I am including a minimal working example showing how I would like a plot to look like and how I would like my code to look like, storing a piece of code for the formatting and a compact code for each plot. Any idea on how I can modify this to make it work? I am working on JMP version 15.2.

 

dt = New Table( "Minimal Working Example",
	Add Rows( 400 ),
	New Column( "X", Numeric, Set Values( Repeat( 1 :: 20, 20 ) ) ),
	New Column( "Y", Numeric, Set Values( Sort Ascending( Shape( Repeat( 1 :: 20, 20 ), 1 ) ) ) ),
	New Column( "Size", Numeric, <<Formula( Random Uniform( 0, 1 ) ) )
);

// How I would like the plot to look like
dt << Graph Builder(
	Variables( X( :X ), Y( :Y ), Color( :Size ) ),
	Elements( Points( X, Y, Legend( 8 ) ) ),
	SendToReport(
		Dispatch(
			{},
			"400",
			ScaleBox,
			{Legend Model(
				8,
				Properties(
					0,
					{gradient( {Color Theme( "White to Red" )} )},
					Item ID( "Size", 1 )
				)
			)}
		),
		Dispatch(
			{},
			"400",
			LegendBox,
			{Legend Position( {8, [0, -1]} ), Position( {0, -1} )}
		)
	)
);

// A theme format I could change for a gazillion of plots
formats = Expr(
	SendToReport(
		Dispatch(
			{},
			"400",
			ScaleBox,
			{Legend Model(
				8,
				Properties(
					0,
					{gradient( {Color Theme( "White to Red" )} )},
					Item ID( "Size", 1 )
				)
			)}
		),
		Dispatch(
			{},
			"400",
			LegendBox,
			{Legend Position( {8, [0, -1]} ), Position( {0, -1} )}
		)
	)
);

// How I would like each plot code to look like
dt << Graph Builder(
	Variables( X( :X ), Y( :Y ), Color( :Size ) ),
	Elements( Points( X, Y, Legend( 8 ) ) ),
	formats
);

 

1 ACCEPTED SOLUTION

Accepted Solutions
ac7872
Level II

Re: Using expressions for theme format

That did not work very well because of the ways X, Y and Color variables change on my data, however I managed to find a closer solution to what I wanted using JSL Quote, Eval Insert, Parse, and Eval:

 

// A theme format I could change for a gazillion of plots
formats = JSL Quote(
	SendToReport(
		Dispatch(
			{},
			"400",
			ScaleBox,
			{Legend Model(
				8,
				Properties(
					0,
					{gradient( {Color Theme( "White to Red" )} )},
					Item ID( "Size", 1 )
				)
			)}
		),
		Dispatch(
			{},
			"400",
			LegendBox,
			{Legend Position( {8, [0, -1]} ), Position( {0, -1} )}
		)
	)
);

// How I would like each plot code to look like
Eval(Parse(Eval Insert("dt << Graph Builder(
	Variables( X( :X ), Y( :Y ), Color( :Size ) ),
	Elements( Points( X, Y, Legend( 8 ) ) ),
	^formats^
);")));

View solution in original post

2 REPLIES 2

Re: Using expressions for theme format

Hi,

 

Expression handling is powerful, and takes a bit of practice. Here is an example to get you started, but you'll want to read up on things like Eval(), Expr(), NameExpr(), Substitute(), Substitute Into(), etc.

 

Names Default To Here(1);

//make a 5-column table
dt = astable((1::20)` || J(20,4,randominteger(0,20)));

//the x column will be the first column
xCol = column (dt, 1);

//the y columns will be the remaining columns
yColList = (dt << get column names())[2::ncol(dt)];

//write the graph builder script, wrapping it in an expression. Use _XXX_ format for things
//you'll be substituting later. Here, that is just the "y" variable for a particular graph.
gbExpr = expr(
	dt << Graph Builder(
		Variables( X( xcol ), Y( _Y_ ) ),
		Elements( Points( X, Y, Legend( 8 ) ) ),
		SendToReport(
			Dispatch(
				{},
				"400",
				ScaleBox,
				{Legend Model(
					8,
					Properties(
						0,
						{gradient( {Color Theme( "White to Red" )} )},
						Item ID( "Size", 1 )
					)
				)}
			),
			Dispatch(
				{},
				"400",
				LegendBox,
				{Legend Position( {8, [0, -1]} ), Legend Position( {0, -1} )}
			)
		)
	);
);

//cycling through the items in yColList, we create a graph for each y variable vs the x variable.
//be sure to read up on Name Expr ( ), as it is needed here to prevent evaluation of the Graph
//Builder script... we just want the code itself... we don't want JMP to try to evaluate the code
//until after we've made the substitution.
for (i = 1,i <=nitems(ycolList), i++,
	eval(Substitute( nameExpr(gbExpr),  expr(_Y_) , expr(yColList[i])));
);

Cheers,

Brady

 

 

 

ac7872
Level II

Re: Using expressions for theme format

That did not work very well because of the ways X, Y and Color variables change on my data, however I managed to find a closer solution to what I wanted using JSL Quote, Eval Insert, Parse, and Eval:

 

// A theme format I could change for a gazillion of plots
formats = JSL Quote(
	SendToReport(
		Dispatch(
			{},
			"400",
			ScaleBox,
			{Legend Model(
				8,
				Properties(
					0,
					{gradient( {Color Theme( "White to Red" )} )},
					Item ID( "Size", 1 )
				)
			)}
		),
		Dispatch(
			{},
			"400",
			LegendBox,
			{Legend Position( {8, [0, -1]} ), Position( {0, -1} )}
		)
	)
);

// How I would like each plot code to look like
Eval(Parse(Eval Insert("dt << Graph Builder(
	Variables( X( :X ), Y( :Y ), Color( :Size ) ),
	Elements( Points( X, Y, Legend( 8 ) ) ),
	^formats^
);")));