Share your ideas for the JMP Scripting Unsession at Discovery Summit by September 17th. We hope to see you there!
Choose Language Hide Translation Bar
Highlighted
mitulshah
Level I

Draw projection from one line chart to another

Hi,

 

I am trying to draw a vertical and horizontal projection line from one point on line graph and find out intersecting points' coordinates (X and Y) for the second line in the same graph. for now I have been doing this manually by visualizing the graphs, but I am curious if there is way that Jmp can return X/Y value automatically.

 

In this example - I manually drew red lines from the purple line chart and want to find where it intersects on green and blue lines

 

mitulshah_0-1580858295254.png

 

1 ACCEPTED SOLUTION

Accepted Solutions
Highlighted
txnelson
Super User

Re: Draw projection from one line chart to another

Here is a very simplistic version of a script that will take your example data table, cast a spline fit through each experiment's data points, and then will allow you to draw the lines from experiment 2(blue) to experiment 1(purple), and then across again to experiment 2. 

touch curves.PNG

Run the script, and then enter a value into the "Exter X value" input box, and then Click on the "create line"

button.  This is a very primitive script, and will only work for X values from about 2.5 to 4.  However, it will give you an idea on how you can build what you want.

Names Default To Here( 1 );

// Create the sample data table
dt = New Table( "Sample",
	Add Rows( 13 ),
	New Column( "Experiment",
		Character,
		"Nominal",
		Set Values(
			{"exp1", "exp1", "exp1", "exp1", "exp2", "exp2", "exp2", "exp2", "exp3", "exp3", "exp3", "exp3", ""}
		)
	),
	New Column( "V",
		Numeric,
		"Continuous",
		Format( "Best", 12 ),
		Set Values( [0.55, 0.65, 0.85, 1.1, 0.55, 0.65, 0.85, 1.1, 0.55, 0.65, 0.85, 1.1, .] )
	),
	New Column( "X-axis",
		Numeric,
		"Continuous",
		Format( "Best", 12 ),
		Set Values( [2.16, 2.79, 3.66, 4.19, 2.47, 3.13, 4.15, 4.72, 2.35, 2.95, 3.88, 4.36, 3] )
	),
	New Column( "Y-axis",
		Numeric,
		"Continuous",
		Format( "Best", 12 ),
		Set Values( [1.183, 2.12, 5.28, 11.2, 1.03, 1.85, 4.54, 9.25, 1.07, 1.93, 4.88, 9.74, .] )
	)
);

nw = New Window( "Draw Lines",
	hlb = H List Box(
// Generate the graph with the curves
		Biv = dt << Bivariate( Y( :Name( "Y-axis" ) ), X( :Name( "X-axis" ) ) ),
		V List Box(
			Spacer Box( size( 1, 30 ) ),
			H List Box( tbMain = Text Box( "Enter X value" ), neb = Number Edit Box() ),
			Button Box( "Create Line",
				start = neb << get;
				
				// Create a list to hold the starting x,y pair
				List1a = {};
				List1a[1] = start;
				
				// Find the Y value on experiment 2
				fit2Y = Spline Eval( start, fitMat2 );
				list1a[2] = fit2y;
				
				// Create a list to hold the second x,y pair
				list1b = {};
				list1b[1] = start;
				fit1Y = Spline Eval( start, fitMat1 );
				list1b[2] = fit1Y;

				// Create a list to hold the third x,y pair, which
				// is the same as the second x,y pair
				list2a = list1b;

				// Create the 4th x,y pair
				// to find the final X value, an iteration of the 
				// experiment 2 spline has to be done until it 
				// is larger than the experiment 1 Y value
				list2b = {};

				count = 0;
				While( fit2Y < fit1Y | count > 300,
					count++;
					fit2Y = Spline Eval( start + (.01 * count), fitMat2 );
				);

				// set the final x,y values
				list2b[1] = start + (.01 * count);
				list2b[2] = fit1Y;

				// Draw the lines
				Report( biv )[FrameBox( 1 )] << add graphics script(
					Pen Color( "red" );
					Pen Size( 2 );
					Line( list1a, list1b );
					Line( list2a, list2b );
				);
			)
		)
	)
);


// add the spline fits and get the prediction matricies for each spline
biv << Fit Where( :Experiment == "exp1", Fit Spline( 0.001, {Line Color( "Purple" ), save coefficients} ) );
fitMat1 = Current Data Table() << get as matrix;
Close( Current Data Table(), nosave );
biv << Fit Where( :Experiment == "exp2", Fit Spline( 0.001, {Line Color( "Medium Dark Blue" ), save coefficients} ) );
fitMat2 = Current Data Table() << get as matrix;
Close( Current Data Table(), nosave );
biv << Fit Where(
	:Experiment == "exp3",
	Fit Spline( 0.001, {Line Color( "Medium Dark Green" ), save coefficients} )
);
fitMat3 = Current Data Table() << get as matrix;
Close( Current Data Table(), nosave );

Jim

View solution in original post

5 REPLIES 5
Highlighted
txnelson
Super User

Re: Draw projection from one line chart to another

The key to being able to do this, is to know what the formula for the line is. JMP can possibly calculate this, given data points, and what curve fit to use....linear, polynomial, spline, etc.
Can you provide more information on your data?
Jim
Highlighted
mitulshah
Level I

Re: Draw projection from one line chart to another

This is the raw data table for the graph. I don't have a formula, I just use connect thorough. 

 

ExperimentVX-axisY-axis
exp10.552.161.183
exp10.652.792.12
exp10.853.665.28
exp11.14.1911.2
exp20.552.471.03
exp20.653.131.85
exp20.854.154.54
exp21.14.729.25
exp30.552.351.07
exp30.652.951.93
exp30.853.884.88
exp31.14.369.74
Highlighted
txnelson
Super User

Re: Draw projection from one line chart to another

Here is a very simplistic version of a script that will take your example data table, cast a spline fit through each experiment's data points, and then will allow you to draw the lines from experiment 2(blue) to experiment 1(purple), and then across again to experiment 2. 

touch curves.PNG

Run the script, and then enter a value into the "Exter X value" input box, and then Click on the "create line"

button.  This is a very primitive script, and will only work for X values from about 2.5 to 4.  However, it will give you an idea on how you can build what you want.

Names Default To Here( 1 );

// Create the sample data table
dt = New Table( "Sample",
	Add Rows( 13 ),
	New Column( "Experiment",
		Character,
		"Nominal",
		Set Values(
			{"exp1", "exp1", "exp1", "exp1", "exp2", "exp2", "exp2", "exp2", "exp3", "exp3", "exp3", "exp3", ""}
		)
	),
	New Column( "V",
		Numeric,
		"Continuous",
		Format( "Best", 12 ),
		Set Values( [0.55, 0.65, 0.85, 1.1, 0.55, 0.65, 0.85, 1.1, 0.55, 0.65, 0.85, 1.1, .] )
	),
	New Column( "X-axis",
		Numeric,
		"Continuous",
		Format( "Best", 12 ),
		Set Values( [2.16, 2.79, 3.66, 4.19, 2.47, 3.13, 4.15, 4.72, 2.35, 2.95, 3.88, 4.36, 3] )
	),
	New Column( "Y-axis",
		Numeric,
		"Continuous",
		Format( "Best", 12 ),
		Set Values( [1.183, 2.12, 5.28, 11.2, 1.03, 1.85, 4.54, 9.25, 1.07, 1.93, 4.88, 9.74, .] )
	)
);

nw = New Window( "Draw Lines",
	hlb = H List Box(
// Generate the graph with the curves
		Biv = dt << Bivariate( Y( :Name( "Y-axis" ) ), X( :Name( "X-axis" ) ) ),
		V List Box(
			Spacer Box( size( 1, 30 ) ),
			H List Box( tbMain = Text Box( "Enter X value" ), neb = Number Edit Box() ),
			Button Box( "Create Line",
				start = neb << get;
				
				// Create a list to hold the starting x,y pair
				List1a = {};
				List1a[1] = start;
				
				// Find the Y value on experiment 2
				fit2Y = Spline Eval( start, fitMat2 );
				list1a[2] = fit2y;
				
				// Create a list to hold the second x,y pair
				list1b = {};
				list1b[1] = start;
				fit1Y = Spline Eval( start, fitMat1 );
				list1b[2] = fit1Y;

				// Create a list to hold the third x,y pair, which
				// is the same as the second x,y pair
				list2a = list1b;

				// Create the 4th x,y pair
				// to find the final X value, an iteration of the 
				// experiment 2 spline has to be done until it 
				// is larger than the experiment 1 Y value
				list2b = {};

				count = 0;
				While( fit2Y < fit1Y | count > 300,
					count++;
					fit2Y = Spline Eval( start + (.01 * count), fitMat2 );
				);

				// set the final x,y values
				list2b[1] = start + (.01 * count);
				list2b[2] = fit1Y;

				// Draw the lines
				Report( biv )[FrameBox( 1 )] << add graphics script(
					Pen Color( "red" );
					Pen Size( 2 );
					Line( list1a, list1b );
					Line( list2a, list2b );
				);
			)
		)
	)
);


// add the spline fits and get the prediction matricies for each spline
biv << Fit Where( :Experiment == "exp1", Fit Spline( 0.001, {Line Color( "Purple" ), save coefficients} ) );
fitMat1 = Current Data Table() << get as matrix;
Close( Current Data Table(), nosave );
biv << Fit Where( :Experiment == "exp2", Fit Spline( 0.001, {Line Color( "Medium Dark Blue" ), save coefficients} ) );
fitMat2 = Current Data Table() << get as matrix;
Close( Current Data Table(), nosave );
biv << Fit Where(
	:Experiment == "exp3",
	Fit Spline( 0.001, {Line Color( "Medium Dark Green" ), save coefficients} )
);
fitMat3 = Current Data Table() << get as matrix;
Close( Current Data Table(), nosave );

Jim

View solution in original post

Highlighted
mitulshah
Level I

Re: Draw projection from one line chart to another

Thanks! that worked. now I just need to figure out how to add loop on this and make it work for N number of experiments.
I am curious about "count > 300", why 300?
Highlighted
txnelson
Super User

Re: Draw projection from one line chart to another

just as a safety check....it should be removed
Jim
Article Labels

    There are no labels assigned to this post.