How to use Filter Change Handler to work with Page option in Graph Builder?
Feb 1, 2024 08:32 AM(5474 views)
Attached is an example data table. The script below tries to plot each parameter selected via the Local Data Filter in a new "Page" in Graph Builder. As it stands, the y-axis title is shown as "Median" every time a new "Parameter" is selected via the Local Data Filter.
I would like the Parameter name to be the y-axis title when new a parameter gets selected and plotted on a new "Page".
I tried using the filter change handler for this, but my script does not quite work. I think I need the index i below to be updated each time a new parameter is selected or may be there is another way. Any direction will be useful.
XPath( "//TextEditBox" ))[i]
here is my script
Names Default To Here (1);
Clear Log ();
gb = Graph Builder(
Size( 531, 325 ),
Show Control Panel( 0 ),
Variables( X( :PartID ), Y( :Median ), Page( :Parameter ), Color( :TestStage ) ),
Elements( Points( X, Y, Legend( 34 ) ) ),
Local Data Filter(
Conditional,
Add Filter(
columns( :TestStage, :Parameter ),
Where( :TestStage == {"A", "B"} ),
Where( :Parameter == {"BKDVoltage", "Capacitance"} )
)
),
SendToReport( Dispatch( {}, "graph title", TextEditBox, {Set Text( "myTitleGoesHere" )} ) )
);
ldf = Current Report()["Local Data Filter"] << get scriptable object;
changeTitle = Function( {this},
print(this);
ldfText = Regex(ldf << get where clause(),"\(?\s*(:Parameter == .*?)\)","\1");
if(ismissing(ldfText),ldfText = " Selected Test Parameter ");
(Report( gb ) << XPath( "//TextEditBox" ))[6] << Set Text(ldfText);
);
fsh = ldf << Make Filter Change Handler(changeTitle());
What is returned can be a bit finicky in my experience (especially when nothing/everything is selected). Next you would have to figure out what to do in those situations and then you should be able to modify my earlier script.
Below are few solutions to this whole thing which do work for me, not sure if the "simpler" one does work in JMP16. I wouldn't suggest looking into these until you have managed to figure out what you could do int the "Empty" situation so you understand what type of issues there could be.
@jthi Ok. Noted the trigger. The script does not work if I have an underscore in my Parameter name (I have got few underscores in the parameters names in my actual data). Example data table attached with underscore in Parameter name. The script below throws an error on the Words function with the attached data table.
Also had to comment the Size() without which the initial charts looked strange.
Names Default To Here (1);
clear log ();
dt = Current Data Table();
gb = dt << Graph Builder(
//Size( 531, 525 ),
Show Control Panel( 0 ),
Variables( X( :PartID ), Y( :Median ), Page( :Parameter ), Color( :TestStage ) ),
Elements( Points( X, Y, Legend( 34 ) ) ),
Local Data Filter(
Conditional,
Add Filter(
columns( :TestStage, :Parameter ),
Where( :TestStage == {"A", "B"} ),
Where( :Parameter == {"BKDVoltage_1", "Capacitance_1"} )
)
),
SendToReport( Dispatch( {}, "graph title", TextEditBox, {Set Text( "myTitleGoesHere" )} ) )
);
update_title = Function( {this},
param_where = Regex(local_filter << get where clause(),"\(?\s*(:Parameter == .*?)\)","\1");
param_where_list = Words(param_where, "|");
tebs = Report(gb) << XPath("//GraphBuilderTitleBox/TextEditBox");
y_tebs= tebs[4::N Items(tebs)::2];
If(N Items(y_tebs) != N Items(param_where_list),
return();
);
For Each({where_str, idx}, param_where_list,
title = Trim Whitespace(Word(-1, where_str, "="));
Substitute Into(title, "\!"", "");
y_tebs[idx] << Set Text(title);
);
);
local_filter = Current Report()["Local Data Filter"] << get scriptable object;
update_title(local_filter);
filter_handler = local_filter << Make Filter Change Handler(update_title());
Re: How to use Filter Change Handler to work with Page option in Graph Builder?
Created:
Feb 1, 2024 12:05 PM
| Last Modified: Feb 1, 2024 9:12 AM(1709 views)
| Posted in reply to message from jthi 02-01-2024
@jthi Thanks, Removing Multiple Response from Parameter properties does make the script work for the example data (exampleSummaryTable2). But I am still having problems with my actual data set where there are no columns with Multiple Response set (unfortunately cannot share actual data). What else could it be?
I can also reproduce this same error if I use comment out this in the script
Names Default To Here (1);
clear log ();
dt = Current Data Table();
gb = dt << Graph Builder(
Size( 531, 525 ),
Show Control Panel( 0 ),
Variables( X( :PartID ), Y( :Median ), Page( :Parameter ), Color( :TestStage ) ),
Elements( Points( X, Y, Legend( 34 ) ) ),
Local Data Filter(
Conditional,
Add Filter(
columns( :TestStage, :Parameter ),
Where( :TestStage == {"A", "B"} ),
//Where( :Parameter == {"BKDVoltage_1", "Capacitance_1"} )
)
),
SendToReport( Dispatch( {}, "graph title", TextEditBox, {Set Text( "myTitleGoesHere" )} ) )
);
update_title = Function( {this},
param_where = Regex(local_filter << get where clause(),"\(?\s*(:Parameter == .*?)\)","\1");
param_where_list = Words(param_where, "|");
tebs = Report(gb) << XPath("//GraphBuilderTitleBox/TextEditBox");
y_tebs= tebs[4::N Items(tebs)::2]; //show (y_tebs);
If(N Items(y_tebs) != N Items(param_where_list),
return();
);
For Each({where_str, idx}, param_where_list,
title = Trim Whitespace(Word(-1, where_str, "="));
Substitute Into(title, "\!"", "");
y_tebs[idx] << Set Text(title);
);
);
local_filter = Current Report()["Local Data Filter"] << get scriptable object;
update_title(local_filter);
filter_handler = local_filter << Make Filter Change Handler(update_title());
In my actual data case, I do not have the luxury to pre-select one or more parameters via the Local Data Filter. Perhaps this is what is causing the issue in the actual data case. Any way to get around this?
param_where = Regex(local_filter << get where clause(),"\(?\s*(:Parameter == .*?)\)","\1");
One reason could be that you have no values selected in local data filter. You could add additional check for missing values and if param_where is missing, return early from the function without doing nothing (or rather then you have all values as parameters and you have to get the parameter values some other way)