It’s World Statistics Day! To honor the theme of the day, the JMP User Community is having conversations about the importance of trust in statistics and data. And we want to hear from you! Tell us the steps you take to ensure that your data is trustworthy.
Choose Language Hide Translation Bar
Highlighted
hrkhan
Level II

Connecting data points using JSL

Hi 

I am trying to connect data points within a graph in certain order (like creating diamond plot etc.). When I connect manually using line and export the script, I see that it used line function with (X,Y) coordinate. Can anyone please help me with

1. I assume those (X,Y) are frame coordinate?

2. Given 1. is true, How do I find out those (X,Y) using JSL? More specifically, need to know the syntax on how to extract out frame (X,Y) for each data point in the graph?

 

Any other efficient way you know how to connect data points in JMP?

sample_plot.JPGsample_plot2.JPG

Thanks much

2 ACCEPTED SOLUTIONS

Accepted Solutions
Highlighted
txnelson
Super User

Re: Connecting data points using JSL

I have adjusted your script a bit, but the main issue is that your code is assuming that you have all combinations of Group1, Group2 and Group3, and in the data you supplied you do not, so the program can not find any data to analyze.

names default to here(1);

dtt = Current Data Table();
 
Summarize( dtt, byGroup1 = by( :var1 ) );
Summarize( dtt, byGroup2 = by( :var2 ) );
Summarize( dtt, byGroup3 = by( :var3 ) );


For( ii = 1, ii < N Items( byGroup1 ), ii++,
	For( jj = 1, jj < N Items( byGroup2 ), jj++,
		For( kk = 1, kk < N Items( byGroup3 ), kk++,
			dtt << select where( :var1 == byGroup1[ii] & :var2 == byGroup2[jj] & :var3 == byGroup3[kk] );
			show(ii,jj,kk,bygroup1[ii],bygroup2[jj],bygroup3[kk]);
			sel = dtt << get selected rows;
			If( n rows(sel) > 0,
			show("inside",ii,jj,kk);
			dt = dtt << subset( selected rows(1), selected columns(0));
			gb = dt << Graph Builder(
				Size( 531, 456 ),
				Show Control Panel( 0 ),
				Variables( X( :x axis ), Y( :y axis ), Overlay( :legend ) ),
				Elements( Points( X, Y, Legend( 5 ) ) ),
				SendToReport(
					Dispatch(
						{},
						"x axis",
						ScaleBox,
						{Format( "Best", 12 ), Min( 2.273568 ), Max( 3.00134902479339 ), Inc( 0.1 ), Minor Ticks( 0 )}
					)
				)
			);
			// Add a simple graphics script to connect the points
			Report( gb )[FrameBox( 1 )] << add graphics script(
				Summarize( dt, byGroup = by( :legend ) );
				colorList = {"Blue", "Red", "Green"};
				Fill Pattern( [0] );
				For( i = 1, i <= N Items( byGroup ), i++,
					Pen Color( colorList[i] );
					theRows = dt << get rows where( :legend == byGroup[i] & :Label != "i" );
		// Add the first value as the last value to complete the object
					theRows = theRows |/ theRows[1];
					xMatrix = :x axis[theRows];
					yMatrix = :y axis[theRows];
					Line( xMatrix, yMatrix );
				);
			););
		)
	)
);
Jim

View solution in original post

Highlighted
hrkhan
Level II

Re: Connecting data points using JSL

No word to appreciate all your help. Thanks a million.

View solution in original post

8 REPLIES 8
Highlighted

Re: Connecting data points using JSL

First, see Help > Scripting Index and search for the Line() function. Then go to Help > JMP Documentation Library > Scripting Guide and search for it again for a more detailed explanation and more examples.

Learn it once, use it forever!
Highlighted
hrkhan
Level II

Re: Connecting data points using JSL

Thanks for your input but I was not able to find out what I was looking for. I see different line function and it shows all for a given coordinate. My question was more on how to find those coordinate [frame and not data (x,y)] for a given data point in the graph. I was able to connect using graph builder but then it also connect the center data points which I do not want. If I do exclude then those data points are not shown which also I do not want. I can still replicate the first set of data points to close the diamond but then do not know how I can still show the data points in the center but not connecting it. Thanks much.

 

hrkhan_0-1592261398582.png

 

 

Highlighted
txnelson
Super User

Re: Connecting data points using JSL

Can you please supply the data that you are creating the graphs from?

Jim
Highlighted
hrkhan
Level II

Re: Connecting data points using JSL

here is the data

 

x-axisy-axislabellegend
2.38562.2608aset1
2.38582.2616aset2
2.41842.2919aset3
2.29792.4459bset1
2.29792.4463bset2
2.33182.4758bset3
2.38562.6498cset1
2.38582.6499cset2
2.41842.6742cset3
2.58752.7302dset1
2.58782.7302dset2
2.61852.7532dset3
2.81742.6498eset1
2.81772.6499eset2
2.83982.6742eset3
2.90592.4459fset1
2.90622.4463fset2
2.92592.4758fset3
2.81742.2608gset1
2.81772.2616gset2
2.83982.2919gset3
2.58752.1817hset1
2.58782.1827hset2
2.61852.2138hset3
2.58752.4459iset1
2.58782.4463iset2
2.61852.4758iset3

 

I am trying to connect data points for each set but not including "i" group (the center data). sample snapshot is below

 

sample_3.JPG

 

Thank you in advance for your help.

Highlighted
txnelson
Super User

Re: Connecting data points using JSL

If a simple graphics script is added to the Graph Builder object you can get what you want

frame.PNG

names default to here(1);

// Create the data table
dt = New Table( "Example",
	Add Rows( 27 ),
	New Script(
		"Source",
		Data Table( "Untitled 60" ) << Split(
			Split By( :Column 2 ),
			Split( :Column 1 ),
			Sort by Column Property
		)
	),
	New Column( "x axis",
		Numeric,
		"Continuous",
		Format( "Best", 12 ),
		Set Values(
			[2.3856, 2.3858, 2.4184, 2.2979, 2.2979, 2.3318, 2.3856, 2.3858, 2.4184,
			2.5875, 2.5878, 2.6185, 2.8174, 2.8177, 2.8398, 2.9059, 2.9062, 2.9259,
			2.8174, 2.8177, 2.8398, 2.5875, 2.5878, 2.6185, 2.5875, 2.5878, 2.6185]
		)
	),
	New Column( "y axis",
		Numeric,
		"Continuous",
		Format( "Best", 12 ),
		Set Values(
			[2.2608, 2.2616, 2.2919, 2.4459, 2.4463, 2.4758, 2.6498, 2.6499, 2.6742,
			2.7302, 2.7302, 2.7532, 2.6498, 2.6499, 2.6742, 2.4459, 2.4463, 2.4758,
			2.2608, 2.2616, 2.2919, 2.1817, 2.1827, 2.2138, 2.4459, 2.4463, 2.4758]
		)
	),
	New Column( "label",
		Character,
		"Nominal",
		Set Values(
			{"a", "a", "a", "b", "b", "b", "c", "c", "c", "d", "d", "d", "e", "e",
			"e", "f", "f", "f", "g", "g", "g", "h", "h", "h", "i", "i", "i"}
		)
	),
	New Column( "legend",
		Character,
		"Nominal",
		Set Values(
			{"set1", "set2", "set3", "set1", "set2", "set3", "set1", "set2", "set3",
			"set1", "set2", "set3", "set1", "set2", "set3", "set1", "set2", "set3",
			"set1", "set2", "set3", "set1", "set2", "set3", "set1", "set2", "set3"}
		)
	)
);

// Draw the scatterplot
gb = dt << Graph Builder(
	Size( 531, 456 ),
	Show Control Panel( 0 ),
	Variables( X( :x axis ), Y( :y axis ), Overlay( :legend ) ),
	Elements( Points( X, Y, Legend( 5 ) ) ),
	SendToReport(
		Dispatch(
			{},
			"x axis",
			ScaleBox,
			{Format( "Best", 12 ), Min( 2.273568 ), Max( 3.00134902479339 ),
			Inc( 0.1 ), Minor Ticks( 0 )}
		)
	)
);
// Add a simple graphics script to connect the points
Report( gb )[FrameBox( 1 )] << add graphics script(
	Summarize( dt, byGroup = by( :legend ) );
	colorList = {"Blue","Red","Green"};
	fill pattern( [0] );
	For( i = 1, i <= N Items( byGroup ), i++,
		Pen Color(colorList[i]);
		theRows = dt << get rows where( :legend == byGroup[i] & :Label != "i" );
		// Add the first value as the last value to complete the object
		theRows = theRows |/ theRows[1]; 
		xMatrix = :x axis[theRows];
		yMatrix = :y axis[theRows];
		line( xMatrix, yMatrix );
	);
);

Jim
Highlighted
hrkhan
Level II

Re: Connecting data points using JSL

Thank you so very much for the help. Greatly appreciate it. I have one more question and will be thankful if you please help.

 

I have a large table consisting of many of the subset (the table I sent you) and controlled by three more additional column. I was trying to create subset of tables(each like the one I sent you) and apply the code below within three For loop. Somehow the subset table generation is not working.

 

 

dtt = Current Data Table();

Summarize( dtt, byGroup1 = by( :var1 ) );
Summarize( dtt, byGroup2 = by( :var2 ) );
Summarize( dtt, byGroup3 = by( :var3 ) );

For( ii = 1, ii < N Items( byGroup1 ), ii++,
    For( jj = 1, jj < N Items( byGroup2 ), jj++,
        For( kk = 1, kk < N Items( byGroup3 ), kk++, 

            dt = dtt << subset(
                select where( :var1 == byGroup1[ii] & :var2 == byGroup2[jj] & :var3 == byGroup3[kk] )
            );

            gb = dt << Graph Builder(
                Size( 531, 456 ),
                Show Control Panel( 0 ),
                Variables( X( :x axis ), Y( :y axis ), Overlay( :legend ) ),
                Elements( Points( X, Y, Legend( 5 ) ) ),
                SendToReport(
                    Dispatch(
                        {},
                        "x axis",
                        ScaleBox,
                        {Format( "Best", 12 ), Min( 2.273568 ), Max( 3.00134902479339 ), Inc( 0.1 ),
                        Minor Ticks( 0 )}
                    )
                )
            );
            // Add a simple graphics script to connect the points
            Report( gb )[FrameBox( 1 )] << add graphics script(
                Summarize( dt, byGroup = by( :legend ) );
                colorList = {"Blue", "Red", "Green"};
                Fill Pattern( [0] );
                For( i = 1, i <= N Items( byGroup ), i++,
                    Pen Color( colorList[i] );
                    theRows = dt << get rows where( :legend == byGroup[i] & :Label != "i" );
                    // Add the first value as the last value to complete the object
                    theRows = theRows |/ theRows[1];
                    xMatrix = :x axis[theRows];
                    yMatrix = :y axis[theRows];
                    Line( xMatrix, yMatrix );
                );
            );
        );
    );
);

 

x-axis y-axis label legend var1 var2 var3
2.385649 2.260832 a set1 con1 con11 con111
2.385782 2.261566 a set2 con1 con11 con111
2.418368 2.291898 a set3 con1 con11 con111
2.297858 2.445948 b set1 con1 con11 con111
2.297908 2.446336 b set2 con1 con11 con111
2.331846 2.475788 b set3 con1 con11 con111
2.385649 2.649821 c set1 con1 con11 con111
2.385782 2.649944 c set2 con1 con11 con111
2.418368 2.674239 c set3 con1 con11 con111
2.587473 2.730171 d set1 con1 con11 con111
2.587765 2.730239 d set2 con1 con11 con111
2.618502 2.753243 d set3 con1 con11 con111
2.817405 2.649821 e set1 con1 con11 con111
2.817657 2.649944 e set2 con1 con11 con111
2.839774 2.674239 e set3 con1 con11 con111
2.905865 2.445948 f set1 con1 con11 con111
2.90615 2.446336 f set2 con1 con11 con111
2.925915 2.475788 f set3 con1 con11 con111
2.817405 2.260832 g set1 con1 con11 con111
2.817657 2.261566 g set2 con1 con11 con111
2.839774 2.291898 g set3 con1 con11 con111
2.587473 2.181713 h set1 con1 con11 con111
2.587765 2.182677 h set2 con1 con11 con111
2.618502 2.213788 h set3 con1 con11 con111
2.587473 2.445948 i set1 con1 con11 con111
2.587765 2.446336 i set2 con1 con11 con111
2.618502 2.475788 i set3 con1 con11 con111
2.624214 2.486915 a set1 con2 con22 con222
2.62436 2.487723 a set2 con2 con22 con222
2.660205 2.521088 a set3 con2 con22 con222
2.527644 2.690543 b set1 con2 con22 con222
2.527699 2.69097 b set2 con2 con22 con222
2.565031 2.723367 b set3 con2 con22 con222
2.624214 2.914803 c set1 con2 con22 con222
2.62436 2.914938 c set2 con2 con22 con222
2.660205 2.941663 c set3 con2 con22 con222
2.84622 3.003188 d set1 con2 con22 con222
2.846542 3.003263 d set2 con2 con22 con222
2.880352 3.028567 d set3 con2 con22 con222
3.099146 2.914803 e set1 con2 con22 con222
3.099423 2.914938 e set2 con2 con22 con222
3.123751 2.941663 e set3 con2 con22 con222
3.196452 2.690543 f set1 con2 con22 con222
3.196765 2.69097 f set2 con2 con22 con222
3.218507 2.723367 f set3 con2 con22 con222
3.099146 2.486915 g set1 con2 con22 con222
3.099423 2.487723 g set2 con2 con22 con222
3.123751 2.521088 g set3 con2 con22 con222
2.84622 2.399884 h set1 con2 con22 con222
2.846542 2.400945 h set2 con2 con22 con222
2.880352 2.435167 h set3 con2 con22 con222
2.84622 2.690543 i set1 con2 con22 con222
2.846542 2.69097 i set2 con2 con22 con222
2.880352 2.723367 i set3 con2 con22 con222
2.743496 2.599957 a set1 con3 con32 con33
2.743649 2.600801 a set2 con3 con32 con33
2.781123 2.635683 a set3 con3 con32 con33
2.642537 2.81284 b set1 con3 con32 con33
2.642594 2.813286 b set2 con3 con32 con33
2.681623 2.847156 b set3 con3 con32 con33
2.743496 3.047294 c set1 con3 con32 con33
2.743649 3.047436 c set2 con3 con32 con33
2.781123 3.075375 c set3 con3 con32 con33
2.975594 3.139697 d set1 con3 con32 con33
2.97593 3.139775 d set2 con3 con32 con33
3.011277 3.166229 d set3 con3 con32 con33
3.240016 3.047294 e set1 con3 con32 con33
3.240306 3.047436 e set2 con3 con32 con33
3.26574 3.075375 e set3 con3 con32 con33
3.341745 2.81284 f set1 con3 con32 con33
3.342073 2.813286 f set2 con3 con32 con33
3.364802 2.847156 f set3 con3 con32 con33
3.240016 2.599957 g set1 con3 con32 con33
3.240306 2.600801 g set2 con3 con32 con33
3.26574 2.635683 g set3 con3 con32 con33
2.975594 2.50897 h set1 con3 con32 con33
2.97593 2.510079 h set2 con3 con32 con33
3.011277 2.545856 h set3 con3 con32 con33
2.975594 2.81284 i set1 con3 con32 con33
2.97593 2.813286 i set2 con3 con32 con33
3.011277 2.847156 i set3 con3 con32 con33
Highlighted
txnelson
Super User

Re: Connecting data points using JSL

I have adjusted your script a bit, but the main issue is that your code is assuming that you have all combinations of Group1, Group2 and Group3, and in the data you supplied you do not, so the program can not find any data to analyze.

names default to here(1);

dtt = Current Data Table();
 
Summarize( dtt, byGroup1 = by( :var1 ) );
Summarize( dtt, byGroup2 = by( :var2 ) );
Summarize( dtt, byGroup3 = by( :var3 ) );


For( ii = 1, ii < N Items( byGroup1 ), ii++,
	For( jj = 1, jj < N Items( byGroup2 ), jj++,
		For( kk = 1, kk < N Items( byGroup3 ), kk++,
			dtt << select where( :var1 == byGroup1[ii] & :var2 == byGroup2[jj] & :var3 == byGroup3[kk] );
			show(ii,jj,kk,bygroup1[ii],bygroup2[jj],bygroup3[kk]);
			sel = dtt << get selected rows;
			If( n rows(sel) > 0,
			show("inside",ii,jj,kk);
			dt = dtt << subset( selected rows(1), selected columns(0));
			gb = dt << Graph Builder(
				Size( 531, 456 ),
				Show Control Panel( 0 ),
				Variables( X( :x axis ), Y( :y axis ), Overlay( :legend ) ),
				Elements( Points( X, Y, Legend( 5 ) ) ),
				SendToReport(
					Dispatch(
						{},
						"x axis",
						ScaleBox,
						{Format( "Best", 12 ), Min( 2.273568 ), Max( 3.00134902479339 ), Inc( 0.1 ), Minor Ticks( 0 )}
					)
				)
			);
			// Add a simple graphics script to connect the points
			Report( gb )[FrameBox( 1 )] << add graphics script(
				Summarize( dt, byGroup = by( :legend ) );
				colorList = {"Blue", "Red", "Green"};
				Fill Pattern( [0] );
				For( i = 1, i <= N Items( byGroup ), i++,
					Pen Color( colorList[i] );
					theRows = dt << get rows where( :legend == byGroup[i] & :Label != "i" );
		// Add the first value as the last value to complete the object
					theRows = theRows |/ theRows[1];
					xMatrix = :x axis[theRows];
					yMatrix = :y axis[theRows];
					Line( xMatrix, yMatrix );
				);
			););
		)
	)
);
Jim

View solution in original post

Highlighted
hrkhan
Level II

Re: Connecting data points using JSL

No word to appreciate all your help. Thanks a million.

View solution in original post

Article Labels