<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />大家好,
我有一个脚本,其中一个输出是使用双变量平台的双变量 (XY) 图。 它基本上是在 y 轴上绘制设备参数的值,在 x 轴上绘制时间。 这些部分在源数据表的列中具有共同的 ID 值。
现在该平台已经具有这样的功能,如果您单击一个标记,则在数据表中选择该标记所基于的行(显示框中的其他标记会变淡)。 我想要的是,当用户单击一个标记时,具有相同 ID 值的所有其他标记也会突出显示(因此用户可以看到这台设备随着时间的推移如何表现)。 我只是在努力寻找一种方法来做到这一点。 是否可以访问平台已经存在的事件处理代码(即当用户单击标记时允许选择行,或者当用户单击并拖动绘图窗口中的矩形时允许选择多行)?
对此的任何帮助将不胜感激。
谢谢。
仅供参考,另一种使用行状态处理程序的方法:
名称默认到这里( 1 ) ;
// 桌子
dt =新表( “二元ID选择” ,
添加行( 10 ) ,
新列( “ID” ,数字, “名义” ,格式( “最好的” , 12 ) ,设定值( [ 2014 , 2011 , 2012 , 2013 , 2014 , 2011 , 2013 , 2012 , 2011 , 2014 ] ) ) ,
新列( “X” ,数字, “连续的” ,格式( “最好的” , 12 ) ,设定值( [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ] ) ) ,
新列( “是” ,数字, “连续的” ,格式( “最好的” , 12 ) ,设定值( [ 20 , 21 , 25 , 28 , 30 , 31 , 33 , 36 , 37 , 40 ] ) ) ,
设置标签列( : ID )
) ;
// 行状态处理函数
选择匹配ID =功能( { X } ,
// 获取当前选中了哪些行
选定的行= [] ;
一世= 1 ;
对于每一行(
如果(已选中(行状态() ) ,
选定的行= V 康卡特(选定的行,一世)
) ;
一世++;
) ;
// 如果有选择,则将其“扩展”到所有需要的行
如果( N 行(选定的行) > 0 ,
展开选定行= [] ;
为了(一世= 1 ,一世<= N 行(选定的行) ,一世++,
这个ID = : ID [选定的行[一世]] ;
匹配行= dt << getRowsWhere ( : ID ==这个ID ) ;
展开选定行= V 康卡特(展开选定行,匹配行) ;
) ;
dt <<选择行(展开选定行) ;
) ;
) ;
// 将处理程序分配给表
rsh = dt << MakeRowStateHandler (选择匹配ID ) ;
// 用 Graph Builder 试试
dt <<图形生成器(
尺寸( 530 , 454 ) ,
显示控制面板( 0 ) ,
变量( X ( : X ) ,是( :是) ) ,
元素(积分( X ,是,传奇( 5 ) ) ,更平滑( X ,是,传奇( 6 ) ) )
) ;
大家好,
我找到了一种可行的方法。 基本上,您只需要创建一个图形脚本,并在其中编写从选定行获取 ID 的代码,然后使用 select where 语句来匹配具有该 ID 的所有行。 如果您单击并拖动“双变量”窗口中的多个点,这也有效。 下面的示例代码。
xParam ="Column Name 1 Here";
yParam = "Column Name 2 Here";
idParam = "Column Name 3 Here";
//tableRef = data table reference
bivPlatform = Bivariate(
Y( Eval(yParam) ),
X( Eval(xParam) ),
);
bivReport = bivPlatform << Report;
bivFrame = bivRawReport[FrameBox( 1 )]; //Assign reference to framebox
// Add Graphics script to select all rows with matching ID when one row is selected on the graph
bivFrame << Add Graphics Script( 2, //Order graphics script is run with respect to other elements in Frame box (Not really needed here)
//Get selected IDs
selectedIDMatrix = tableRef:idParam[ ( tableRef << Get Selected Rows() ) ];
//Get unique IDs (optional I guess)
idArray = Associative Array(selectedIDMatrix);
uniqueIDMatrix = idArray << Get Keys;
//Select other datapoints with matching IDs
tableRef << Select Where( Contains( As List(uniqueIDMatrix), As Column(tableRef, idParam) ) );
);
嗨,Scwise,
感谢这一点,并期待在我升级到 JMP 12 时拥有此功能。
我有点想在双变量显示框中寻找这个功能。 要使用上面的示例,我想单击 2014 年的数据点,并突出显示所有 2014 年的点。 我希望那里有一个纯脚本解决方案。
无论如何,再次感谢您的回复。
恩凯莱,
感谢您提出关于能够在 Fit X By Y Bivariate Graph 中选择某些内容的问题,但随后将所有对应点返回到突出显示的数据表中,这些点与所选点具有相似的 ID。虽然您想要做的事情可能仍然有一个更优雅的“从头开始编写脚本”的答案,但我发现了一种使用新 JMP 12 应用程序生成器功能的简单方法,该功能允许将图形用作数据过滤器。然后希望您可以在您当前的工作中使用这个现成脚本的一部分,或者也许只是能够使用这个开箱即用的功能。请注意,我使用的是适用于 Mac 的 JMP 12.1 版本。
在这种情况下,我们创建了一个简单的数据表,就像您描述的那样,包含三列:ID、X 和 Y,其中几个 ID 具有多行不同的 X 和 Y 测量值。 然后,我们将数据表和列的分布组合到一个窗口中(在 JMP 中组合窗口以获得自定义报告视图),以便您可以看到我们的初始设置。

然后我们创建了一个图表,显示 Y 与 X 的二元拟合。此时如果您选择一个点,您实际上只是基于 X 和 Y 坐标进行选择。让该点的 ID 标签显示出来是没有问题的,但这只会将那个确切的点隐藏(选择)回您的数据表中。所以问题是双变量将仅基于相似的 X 和 Y 坐标而不是常见的 ID 来寻找匹配项。请参阅下一个自定义报告视图。
所以想也许我们可以通过在双变量旁边创建一个“帮助”图来使这成为一个非常简单的两步过程,这样我就可以一键选择所有感兴趣的 ID 点。为此,我创建了一个 ID 分布(为了更好的选择能力,我将其制成名义数据列类型),然后关闭除马赛克图之外的所有显示选项。然后将分布图和双变量图合并到一个窗口中,以获得另一个自定义报告视图。然后在报告标题中的红色三角形下,我们选择了编辑应用程序按钮,该按钮会打开应用程序生成器工作区(在选择基础数据表之后)。现在在 App 开发器中,只需选择第一个分布马赛克图,右键单击它并选择用作过滤器即可。现在我可以有一个两次单击的解决方案...首先我在 Bivariate Fit Y By X 图表上选择我关心的点,然后可以滑动并选择(单击方向)部分阴影马赛克中的完整 ID现在将突出显示数据表上的所有相似 ID。在我们在马赛克图上选择它之后,还可以在 Bivariate Fit Y By X 图表上以图形方式查看与相同 ID 号相对应的所有点。


现在您可以转到报告标题下的红色三角形并将脚本保存到脚本窗口,以查看在创建此视图时为您生成的底层脚本工作。同样,虽然这不像直接从 Bivariate Fit Y By X 中那样巧妙,但它确实显示了一个开箱即用的解决方案,并为您提供了一种自动生成一些脚本的方法。将在此 JMP 工作文件中附加已保存的脚本供您检出。
希望这可以帮助!