キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

Discussions

Solve problems, and share tips and tricks with other JMP users.
言語を選択 翻訳バーを非表示
antonio-domenic
Level III

how correctly use Graph Builder and Slider box in different windows

I would use graph builder in combination with slider to change the appearance of the plot. In the example below I create a window with a map and a slider box to change interactively the scale of the colors. I would use the script to create different windows (of course, even with different variables, but in the example this stuff is not needed). It works just for the last created window, despite I try to assign the variables using namespaces. I tried different way but all unsuccessfully. Can anyone help?

 

Names Default To Here(1);
dtable= Open("$SAMPLE_DATA/SAT.jmp");
name="Map";
For(k=1, k<=10, k++,
    If(Namespace Exists(Eval("ns" || name || Char(k))),
        //If(k = 10,
        // hanlde the max number of allowed namespaces
        //);
      ,
    name= name || char(k);
    nsRef = New Namespace(Eval("ns" || name ));
    Break();
      )
);
 
nsRef << Insert("column", "% Taking (2004)");
nsRef << Insert("min", col min(column(dtable, "% Taking (2004)")));
nsRef << Insert("max", col max(column(dtable, "% Taking (2004)")));
nsRef << Insert("slmin", col min(column(dtable, "% Taking (2004)")));
nsRef << Insert("slmax", col max(column(dtable, "% Taking (2004)")));
 
datacolumn=column(dtable, nsRef:column );
 
nsRef << Insert("slider1",
    slider box(nsRef:min,nsRef:max,nsRef:slmax,
        title= Current Window() << Get Window Title;
        ns = NameSpace(Eval("ns" || title));
             slmin=ns:slmin;
                slmax=ns:slmax;
        scale=Matrix( {slmin,slmax} );
             scale=scale`;
        ns:gb <<SendToReport( 
                       Dispatch({},"400",
                       ScaleBox,
                           {Legend Model( 3,
                           Properties(0,{gradient( {Scale Values( scale ), Width( 12 )} )})
                            )}
                      )
               );
        );
);
 
new window(name,
nsRef << Insert("gb",
          Graph Builder(
             Show Control Panel( 0 ),
             Variables( Color( datacolumn ), Shape( :State ) ),
             Elements(
                                  Map Shapes(
                      Legend( 2 ),
                      Summary Statistic( "Mean" ),
                      Show Missing Shapes( 0 )
                                 )
                          ),
                          SendToReport(
                                 Dispatch({},"",
                               ScaleBox,
                   {Scale( "Geodesic" ), Min( -137.654643872302 ), Max( -63.2427990180921 ),
                   Inc( 10 ), Minor Ticks( 0 )}
 
                                ),
                                Dispatch({},"",
                     ScaleBox( 2 ),
                     {Scale( "Geodesic" ), Min( 16.7170042692343 ), Max( 80.0833409028976 ),
                     Inc( 10 ), Minor Ticks( 0 )}
                          )
                     )
               ),
 ),
H List Box(
Text Box("scale: max"),
      nsRef:slider1,
),
);

 

1 件の受理された解決策

受理された解決策
gzmorgan0
Super User (Alumni)

Re: how correctly use Graph Builder and Slider box in different windows

You are movng in the correct direction. You do need a local space, and depending upon the task here are several options, that I would recommend:

 

  1. Since you are only changing the legend, and each GB will be in a separate window, a simple method to do this is to use the window scope, window namespace window:slider1 = SliderBox(). See the attached script.  
  2. If only the legend is being changed and if you have multiple GBs in the window, use a  <<Set Function( Function()) for the slider box that uses a relative reference to the corresponding GB. If the GB, and HListBox(TextBox, Sliderbox) are nested in a VListBox the function would be something like  (this<< parent)<<parent to get to theVListBox then you can use messages to get to the legendbox and make the changes.  I like to use Xpath(). This type of coding is a little trickier.
  3. Suppose you have multiple GBs with different Y's  but same X. If you wanted to limit X  or exclude a row for Y1 but not Y2, then each GB should have its own Data Filter Context Box(), local data filter.

Hopefully, the attached script that uses window scoping will meet your  current need.

元の投稿で解決策を見る

2件の返信2
gzmorgan0
Super User (Alumni)

Re: how correctly use Graph Builder and Slider box in different windows

You are movng in the correct direction. You do need a local space, and depending upon the task here are several options, that I would recommend:

 

  1. Since you are only changing the legend, and each GB will be in a separate window, a simple method to do this is to use the window scope, window namespace window:slider1 = SliderBox(). See the attached script.  
  2. If only the legend is being changed and if you have multiple GBs in the window, use a  <<Set Function( Function()) for the slider box that uses a relative reference to the corresponding GB. If the GB, and HListBox(TextBox, Sliderbox) are nested in a VListBox the function would be something like  (this<< parent)<<parent to get to theVListBox then you can use messages to get to the legendbox and make the changes.  I like to use Xpath(). This type of coding is a little trickier.
  3. Suppose you have multiple GBs with different Y's  but same X. If you wanted to limit X  or exclude a row for Y1 but not Y2, then each GB should have its own Data Filter Context Box(), local data filter.

Hopefully, the attached script that uses window scoping will meet your  current need.

antonio-domenic
Level III

Re: how correctly use Graph Builder and Slider box in different windows

excellent!! simple and effective. I appreciate your additional suggestions.
Thanks a lot!

おすすめの記事