cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
JMP is taking Discovery online, April 16 and 18. Register today and join us for interactive sessions featuring popular presentation topics, networking, and discussions with the experts.
Choose Language Hide Translation Bar
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
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
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
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
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
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?
txnelson
Super User

Re: Draw projection from one line chart to another

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