cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
The Discovery Summit 2025 Call for Content is open! Submit an abstract today to present at our premier analytics conference.
See how to use to use Text Explorer to glean valuable information from text data at April 25 webinar.
Choose Language Hide Translation Bar
View Original Published Thread

Arrange in rows by group

Hegedus
Level IV

Hi,

 

Here is the problem I am trying to solve:

6 Y continuous variables (Y1,Y2,..Y6), same continuous X variable (1) and sample ID field (SID).

I am doing a BiVariate fit grouping by SID. I would like all 6 plots to be in a row and with each SID group.

SID=1

Y1,Y2,Y3,Y4,Y5,Y6,

SID=2

Y1,Y2,Y3,Y4,Y5,Y6,

......

 

How would I script this?  The Y's and X are know and fixed while the number of sample IDs will vary.

 

Andy

 

3 ACCEPTED SOLUTIONS

Accepted Solutions
txnelson
Super User


Re: Arrange in rows by group

Here is an example script using a methodlogy I have used many times, that I think produces the results you want.

Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/semiconductor capability.jmp" );

// Setup data to look somewhat like your data
dt << delete columns( 1, 2, 3 );
Column( dt, 1 ) << set name( "SID" );
Column( dt, 2 ) << set name( "X" );
Column( dt, 3 ) << set name( "Y1" );
Column( dt, 4 ) << set name( "Y2" );
Column( dt, 5 ) << set name( "Y3" );
Column( dt, 6 ) << set name( "Y4" );
Column( dt, 7 ) << set name( "Y5" );
Column( dt, 8 ) << set name( "Y6" );
dt << delete columns( Index( 9, 129 ) );

// Determine the number of SIDs
Summarize( dt, SIDgrps = by( SID ) );

// Create the output window
nw = New Window( "Report", MainVLB = V List Box() );

// Create a list to hold the data table names 
dtList = {};

// Setup what to do when the display window is closed
nw << on close( For( i = 1, i <= N Items( SIDgrps ), i++, Close( dtList[i], nosave ) ) );

// Loop through the SIDs and generate the required reports
For( i = 1, i <= N Items( SIDgrps ), i++,
	dt << select where( :SID == Num( SIDgrps[i] ) );
	dtSub = dt << subset( selected rows( 1 ), selected columns( 0 ), invisible );
	Insert Into( dtList, dtSub );
	dtSub << set name( "SID=" || SIDgrps[i] );
	ob = Outline Box( "SID=" || SIDgrps[i],
		H List Box(
			dtSub = Bivariate( Y( :Y1 ), X( :X ) ),
			dtSub = Bivariate( Y( :Y2 ), X( :X ) ),
			dtSub = Bivariate( Y( :Y3 ), X( :X ) ),
			dtSub = Bivariate( Y( :Y4 ), X( :X ) ),
			dtSub = Bivariate( Y( :Y5 ), X( :X ) ),
			dtSub = Bivariate( Y( :Y6 ), X( :X ) ),

		)
	);
	// Add the current set of reports to the main display
	MainVLB << append( ob );
);
Jim

View solution in original post


Re: Arrange in rows by group

From your description, it seems like all you have to do is use SID in the By role.

Bivariate(
	Y( :Y1, :Y2, :Y3, :Y4, :Y5, :Y6 ),
	X( :X ),
	By( :SID )
);

View solution in original post


Re: Arrange in rows by group

I think this way might be simpler and give you the layout you want:


New Window( "Fitness - Bivariate",
	V List Box(
		Fit Group(
			Bivariate( Y( :Age ), X( :MaxPulse ) ),
			Bivariate( Y( :Weight ), X( :MaxPulse ) ),
			Bivariate( Y( :Oxy ), X( :MaxPulse ) ),
			Bivariate( Y( :Runtime ), X( :MaxPulse ) ),
			Bivariate( Y( :RunPulse ), X( :MaxPulse ) ),
			Bivariate( Y( :RstPulse ), X( :MaxPulse ) ),
			<<{Arrange in Rows( 2 )},
			By( :Sex )
		),
		Fit Group(
			Bivariate( Y( :Age ), X( :MaxPulse ) ),
			Bivariate( Y( :Weight ), X( :MaxPulse ) ),
			Bivariate( Y( :Oxy ), X( :MaxPulse ) ),
			Bivariate( Y( :Runtime ), X( :MaxPulse ) ),
			Bivariate( Y( :RunPulse ), X( :MaxPulse ) ),
			Bivariate( Y( :RstPulse ), X( :MaxPulse ) ),
			<<{Arrange in Rows( 2 )},
			By( :Sex )
		)
	)
);

View solution in original post

5 REPLIES 5
txnelson
Super User


Re: Arrange in rows by group

Here is an example script using a methodlogy I have used many times, that I think produces the results you want.

Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/semiconductor capability.jmp" );

// Setup data to look somewhat like your data
dt << delete columns( 1, 2, 3 );
Column( dt, 1 ) << set name( "SID" );
Column( dt, 2 ) << set name( "X" );
Column( dt, 3 ) << set name( "Y1" );
Column( dt, 4 ) << set name( "Y2" );
Column( dt, 5 ) << set name( "Y3" );
Column( dt, 6 ) << set name( "Y4" );
Column( dt, 7 ) << set name( "Y5" );
Column( dt, 8 ) << set name( "Y6" );
dt << delete columns( Index( 9, 129 ) );

// Determine the number of SIDs
Summarize( dt, SIDgrps = by( SID ) );

// Create the output window
nw = New Window( "Report", MainVLB = V List Box() );

// Create a list to hold the data table names 
dtList = {};

// Setup what to do when the display window is closed
nw << on close( For( i = 1, i <= N Items( SIDgrps ), i++, Close( dtList[i], nosave ) ) );

// Loop through the SIDs and generate the required reports
For( i = 1, i <= N Items( SIDgrps ), i++,
	dt << select where( :SID == Num( SIDgrps[i] ) );
	dtSub = dt << subset( selected rows( 1 ), selected columns( 0 ), invisible );
	Insert Into( dtList, dtSub );
	dtSub << set name( "SID=" || SIDgrps[i] );
	ob = Outline Box( "SID=" || SIDgrps[i],
		H List Box(
			dtSub = Bivariate( Y( :Y1 ), X( :X ) ),
			dtSub = Bivariate( Y( :Y2 ), X( :X ) ),
			dtSub = Bivariate( Y( :Y3 ), X( :X ) ),
			dtSub = Bivariate( Y( :Y4 ), X( :X ) ),
			dtSub = Bivariate( Y( :Y5 ), X( :X ) ),
			dtSub = Bivariate( Y( :Y6 ), X( :X ) ),

		)
	);
	// Add the current set of reports to the main display
	MainVLB << append( ob );
);
Jim


Re: Arrange in rows by group

From your description, it seems like all you have to do is use SID in the By role.

Bivariate(
	Y( :Y1, :Y2, :Y3, :Y4, :Y5, :Y6 ),
	X( :X ),
	By( :SID )
);
Hegedus
Level IV


Re: Arrange in rows by group

The code from txnelson does the job,  Though in his example I needed comment out the code line

//dt << delete columns( Index( 9, 129 ) ); for it to run.

 

I must admit, I don't fully understand it and I stumbled a bit with this line

dt << select where( :SID == Num( SIDgrps[i] ) ); since my ID is actually character.  I removed the Num() to get it to work.

 

Mark's solution only does the by SID grouping but does not group the plots in rows.

 

Andy


Re: Arrange in rows by group

This shows one way to control the layout but the resulting array of plots is the transpose of what you want.

New Window( "In a Row",
	Line Up Box( N Col( 2 ),
		Bivariate(
			Y( :age, :weight, :oxy, :runtime ),
			X( :runpulse ),
			By( :sex )
		)
	)
);


Re: Arrange in rows by group

I think this way might be simpler and give you the layout you want:


New Window( "Fitness - Bivariate",
	V List Box(
		Fit Group(
			Bivariate( Y( :Age ), X( :MaxPulse ) ),
			Bivariate( Y( :Weight ), X( :MaxPulse ) ),
			Bivariate( Y( :Oxy ), X( :MaxPulse ) ),
			Bivariate( Y( :Runtime ), X( :MaxPulse ) ),
			Bivariate( Y( :RunPulse ), X( :MaxPulse ) ),
			Bivariate( Y( :RstPulse ), X( :MaxPulse ) ),
			<<{Arrange in Rows( 2 )},
			By( :Sex )
		),
		Fit Group(
			Bivariate( Y( :Age ), X( :MaxPulse ) ),
			Bivariate( Y( :Weight ), X( :MaxPulse ) ),
			Bivariate( Y( :Oxy ), X( :MaxPulse ) ),
			Bivariate( Y( :Runtime ), X( :MaxPulse ) ),
			Bivariate( Y( :RunPulse ), X( :MaxPulse ) ),
			Bivariate( Y( :RstPulse ), X( :MaxPulse ) ),
			<<{Arrange in Rows( 2 )},
			By( :Sex )
		)
	)
);