Subscribe Bookmark RSS Feed

sheetbox in a for loop ?

bthaby1

Community Trekker

Joined:

Feb 23, 2012

I have been trying to create a display using sheet boxes and its not going well.

I am using a for loop to create a display and using "hsheetbooxname << append" commands . .

but not getting it right.   In this simple example below. . can someone

show me how to convert this to type where you open an empty sheet box. .

then append in the different objects ?    The << Hold command has me stumped.

dt = Open("$ENGLISH_SAMPLE_DATA/Big Class.jmp");

dt << minimize window();

NewWindow("Example",

  VSheetBox(

  <<Hold(Bivariate(Y(:weight), X(:height), FitLine())),

  <<Hold(Distribution(Continuous Distribution(Column(:height),Horizontal Layout(1),Outlier Box Plot(0)))),

  <<Hold(Tree Map(Categories(:age))),

     <<Hold(Bubble Plot(X(:height),Y(:weight),Sizes(:age),Coloring(:sex),Circle Size(6.226),All Labels(0))),

  HSheetBox(

  SheetPart("", ExcerptBox(1, {PictureBox(1)})),

  SheetPart("", ExcerptBox(2, {PictureBox(1)}))

  ),

  HSheetBox(

  SheetPart("", ExcerptBox(3, {PictureBox(1)})),

  SheetPart("", ExcerptBox(4, {PictureBox(1)}))

  )

  )

);

1 ACCEPTED SOLUTION

Accepted Solutions
Solution

Almost there. It seems like Hold() works with the expression rather than the platform object.

Try redefining your g's like this:

  g1 = expr( Bivariate(Y(:weight), X(:height), FitLine()));

  g2 = expr( Distribution(Column(:height),Horizontal Layout(1),Outlier Box Plot(0)));

  g3 = expr( Tree Map(Categories(:age)));

  g4 = expr( Bubble Plot(X(:height),Y(:weight),Sizes(:age),Coloring(:sex),Circle Size(6.226),All Labels(0)));


8 REPLIES
bthaby1

Community Trekker

Joined:

Feb 23, 2012

Here is more of the format I am looking for. . this one does not work.

I need to apply the logic to a much larger sheetbox project I am working on.

dt = Open("$ENGLISH_SAMPLE_DATA/Big Class.jmp");

dt << minimize window();

w = NewWindow("New Example", vsb = Vsheetbox());

  g1 = dt << Bivariate(Y(:weight), X(:height), FitLine());

  g2 = dt << Distribution(Column(:height),Horizontal Layout(1),Outlier Box Plot(0));

  g3 = dt << Tree Map(Categories(:age));

  g4 = dt << Bubble Plot(X(:height),Y(:weight),Sizes(:age),Coloring(:sex),Circle Size(6.226),All Labels(0));

   

    vsb <<Hold(g1);

    vsb <<Hold(g2);

    vsb <<Hold(g3);

    vsb <<Hold(g4);

  

  sp1 = SheetPart("platform1", ExcerptBox(1, {PictureBox(1)}));

  sp2 = SheetPart("platform2", ExcerptBox(2, {PictureBox(1)}));

  hsb1 = HSheetBox();

      hsb1 << append(sp1);

      hsb1 << append(sp2);

    

    vsb << append(hsb1);

     

   sp3 = SheetPart("platform3", ExcerptBox(3, {PictureBox(1)}));

  sp4 = SheetPart("platform4", ExcerptBox(4, {PictureBox(1)}));

 

  hsb2 = HSheetBox();

   hsb2 << append(sp3);

   hsb2 << append(sp4);

     

  vsb << append(hsb2);

    w << Bring Window to Front;

  w << refresh;

Solution

Almost there. It seems like Hold() works with the expression rather than the platform object.

Try redefining your g's like this:

  g1 = expr( Bivariate(Y(:weight), X(:height), FitLine()));

  g2 = expr( Distribution(Column(:height),Horizontal Layout(1),Outlier Box Plot(0)));

  g3 = expr( Tree Map(Categories(:age)));

  g4 = expr( Bubble Plot(X(:height),Y(:weight),Sizes(:age),Coloring(:sex),Circle Size(6.226),All Labels(0)));


bthaby1

Community Trekker

Joined:

Feb 23, 2012

Thanks MS.. that worked perfectly and saved me more frustration with that hurdle. 

My bigger project actually has some Substitution expressions using a list of columns. .will see if I can apply this learning to that.

Will let you know how it comes out.  I may be calling again.

ms

Super User

Joined:

Jun 23, 2011

I tried to build a sheet box with a for loop and came up with this code. It's adapted to collect graphs from a report with an arbitrary (>1) number of by-groups, i.e several similar graphs for different subgroups within the same window. But the principle should be possible to adapt to any collection of objects. Btw, try changing Picture Box(1) to Table Box(1) or Listbox(1).

// Script to collect graphs from a report with by-groups

dt = Open( "$ENGLISH_SAMPLE_DATA/Big Class.jmp" );

by_column = Column( "age" );

objexpr = Expr( Bivariate( Y( :weight ), X( :height ), FitLine(), by( by_column ) ) );

//some math to define the layout

Summarize( g = by( by_column ) );

nobj = N Items( g );

rows = Floor( Sqrt( nobj ) );

cols = Ceiling( nobj / rows );

//Set up the panels

vsb = V Sheet Box( <<hold( objexpr ) );

HSheetBoxes = {};

For( i = 1, i <= rows, i++,

  Insert Into( HSheetBoxes, H Sheet Box() );

  vsb << append( HSheetBoxes[i] );

);

// Populate with elements from reports

For( i = 1, i <= rows * cols, i++,

  If( i <= nobj,

  HSheetBoxes[Ceiling( i / cols )] << append(

  Sheet Part( by_column << get name || " = " || g[i], Excerpt Box( i, {picture Box( 1 )} ) )

  ),

  HSheetBoxes[Ceiling( i / cols )] << append( Spacer Box() )

  )

);

//Make window

New Window( headname(objexpr), vsb );

bthaby1

Community Trekker

Joined:

Feb 23, 2012

Wow.  Your for loop example is great and close to what I am trying to do.   Yours is much more elegant than mine.  Humbling.  I will have to study yours

carefully.   My brain is still scripting basic expressions and evaluating basic expressions. . I need to get this concept to click to get to the next level.

Thank you.

ms

Super User

Joined:

Jun 23, 2011

Thanks! The conditional spacer box thing is just cometic. It adds empty boxes to the end if the number of graphs does not fit the layout matrix. It works without this feature but any trailing graphs are then automatically resized to fill the sheetbox which may look ugly.

For me, learning JSL has been a lot of trial and error. Many hours spent to find elaborate workarounds for (poorly documented) things that "should" work but don't. Later I often find a much simpler way, e.g. on this forum. Good luck!

bthaby1

Community Trekker

Joined:

Feb 23, 2012

MS,

in your sheetbox example above, can you save this as a journal ?

I get a jmp exception when I do.

Brad

ms

Super User

Joined:

Jun 23, 2011

If you mean to Journal the Window holding the sheetbox, yes, I can save it to a journal both manually and by script. The displaybox vsb can also be journaled directly. Tested with JMP 9 and 10 for Mac.