图形生成器:隐藏 X 个没有数据的类别大家好,
我有一个带有分组列和几个响应变量的表。
New Table( "Test",
Add Rows( 7 ),
New Column( "GROUP",
Character,
"Nominal",
Set Values( {"a", "b", "c", "d", "e", "f", "g"} )
),
New Column( "Y",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [7, ., 6, ., 4, ., 2] )
),
New Column( "Y 2",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [7, 6, 2, 3, ., ., .] ),
Set Display Width( 49 )
)
)我想创建一个带有列切换器的条形图。
Graph Builder(
Size( 527, 448 ),
Show Control Panel( 0 ),
Variables(
X( :GROUP, Order By( :Y, Ascending, Order Statistic( "Mean" ) ) ),
Y( :Y )
),
Elements( Bar( X, Y, Legend( 4 ) ) ),
Column Switcher( :Y, {:Y, :Y 2} )
)我的问题是我不想显示没有数据的级别。 换句话说,我不想看到 Y 的级别“b”、“d”和“f”以及 Y2 的级别“e”、“f”、“g”。

我尝试使用“where”子句,但不幸的是列切换器没有考虑它。
您知道我们如何做到这一点吗?
提前致谢!
回复:图形生成器:隐藏没有数据的 X 类别你好@geoffrey_mann ,
感谢您的参与和额外信息。
我将开始向我的同事宣传该功能以获得选票! 
关于脚本,我希望不影响当前表,所以我认为本地数据过滤器是一个不错的选择! 我将更深入地探讨这种可能性。
回复:图形生成器:隐藏没有数据的 X 类别你好@anne_sa
我很高兴这有帮助。 这是我想做的事情有一段时间了,你给了我动力。 
另外,我同意你的观点,并且@vince_faller侦听器或围绕列切换器自定义行为的方法通常对于那些编写自己的插件或更改行为的人很有用。 我们在 JMP Clinical 和 JMP Genomics 中一直这样做,这就是为什么我将功劳归功于@kelci_miclaus和@drewfoglia对于我借用的代码。
如果我们认识一位 JMP 产品经理可以帮助实现这一目标就好了。
请你们俩投票支持该功能,这将有助于证明其合理性。
至于最终的更改,您应该可以控制您编写的包装器代码。 API 调用只是为了替换 X 和 Y 变量。 我将继续添加这些函数来帮助程序员简化 GraphBuilder 的包装,以便他们可以更快地构建插件。 我在这里想说的只是添加函数来更新 API 文件中的 GraphBuilder,以便您使用的任何“驱动程序”文件都具有选择行为。 请注意,我可以将 dt <
请注意驱动程序文件中的clearrowstates:
dt << clearrowstates();
newvarname = lb<<GETSELECTED></GETSELECTED>
根据我对您想要执行的操作的“简单化”理解,我建议您只需替换 dt << clearrowstates();与 dt <<取消排除();请告诉我这是否是您喜欢的行为或者是否比这更复杂。
回复:图形生成器:隐藏没有数据的 X 类别我完全同意你的看法@vince_faller ,这将是一个非常好的功能:)
我想我会把它添加到 JMP 愿望清单中!
回复:图形生成器:隐藏没有数据的 X 类别非常感谢您提供这些脚本@geoffrey_mann
绝对比我做的干净!
我只想调整一件事:每次我们在列表框中选择一个新变量时,行状态都会重置。 因此,如果某些点已被标记/排除/着色...我们将丢失此信息,这可能会很烦人。
否则它符合我的期望,所以再次感谢!
回复:图形生成器:隐藏没有数据的 X 类别如果列开关有一个 <回复:图形生成器:隐藏没有数据的 X 类别
你好,我们又见面了@anne_sa ,
抱歉耽搁了,我实际上感染了流感几天,有点落后了。
我附上了两个文件。 第一个 jsl 文件(更改行状态的示例脚本.jsl)是驱动程序文件,第二行中的路径是放置第二个文件 (GraphBuilderJSLAPI.jsl) 的位置的完整路径。
//Include script to modify GraphBuilder with some special functions defined
include(ConvertFilePath("/Users/gemann/Projects/Prototypes/JSLClasses/GraphBuilderJSLAPI.jsl", absolute, windows));
//Create a sample table
dt = New Table( "Test",
Add Rows( 7 ),
New Column( "GROUP",
Character,
"Nominal",
Set Values( {"a", "b", "c", "d", "e", "f", "g"} )
),
New Column( "Y",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [7, ., 6, ., 4, ., 2] )
),
New Column( "Y 2",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [7, 6, 2, 3, ., ., .] ),
Set Display Width( 49 )
)
);
//Add a new window and build a listbox beside a graphbuilder
New Window( "CustomColumnSwitcher Window",
//Start by getting all of the columns in the current datatable
CNames = dt << Get Column Names( Numeric );
Show( CNames );
//User a horizontal layout
HListBox(
//Use a ListBox as the new Column Switcher
lb = List Box(
CNames,
maxSelected(1),
//The next lines specify the script that gets run when an item in listbox is selected
dt << clearrowstates();
newvarname = lb<<GETSELECTED></GETSELECTED>
祝您好运,如果您有任何问题请告诉我。 当然这些文件还没有经过充分测试! 
回复:图形生成器:隐藏没有数据的 X 类别你好@geoffrey_mann ,
我写了一些东西来基本上更新列切换器并更改轴设置(如建议的@朱利安)每次我们选择一个新变量。 然而,它可能不是很有效,所以我当然对你的解决方案非常感兴趣!
回复:图形生成器:隐藏没有数据的 X 类别嗨安妮,
我想再次与您联系,看看您是否找到了解决问题的编码解决方案。 我花了一段时间才找到时间,但如果您仍然需要的话,我有一个编码解决方案。
回复:图形生成器:隐藏没有数据的 X 类别你好@朱利安!
我非常感谢您为解决我的问题所做的努力! 不幸的是,一个响应变量与下一个响应变量的非缺失水平的数量可能不同。 但是,您的上一篇文章绝对可以用于“编码解决方案”。 根据级别编号更改轴设置确实是显示预期内容的好方法。 我会朝这个方向努力。 感谢您的帮助!
回复:图形生成器:隐藏没有数据的 X 类别你好@anne_sa ,
我明白你的意思。 这确实可能归结为编写一些自定义的代码,但让我对此进行更多的交互式尝试。 每个 Y 的组是否始终只有四个级别(尽管级别不同)? 如果是这样,这里有一个潜在的黑客:图形生成器将在列切换时维护 X 轴,并且由于您的级别按升序排列(因此空白级别始终位于末尾),我们可以调整轴,以便仅显示四个级别。 您可以在轴设置中执行此操作(右键单击轴 > 轴设置),或者只需拖出轴的末端直到隐藏缺失的级别)。
Graph Builder(
Show Control Panel( 0 ),
Variables( X( :GROUP, Order By( :Y, Ascending, Order Statistic( "Mean" ) ) ), Y( :Y ) ),
Elements( Bar( X, Y, Legend( 4 ) ) ),
Column Switcher( :Y, {:Y, :Y 2} ),
SendToReport( Dispatch( {}, "GROUP", ScaleBox, {Min( -0.5 ), Max( 3.5 ), Inc( 1 ), Minor Ticks( 0 )} ) )
);

也许是您的情况的潜在解决方案?
@朱利安
回复:图形生成器:隐藏没有数据的 X 类别谢谢@朱利安对于这个建议! 事实上,它允许仅显示带有数据的级别。
唯一的问题(但也许我问得太多)是我们失去了行之间的链接。 例如,如果我为 Y 选择级别“a”,并且想要查看 Y2 的相应值,则当我使用本地数据过滤器选择 Y2 时,不会突出显示任何内容。
也许编码预期的行为是解决方案......
回复:图形生成器:隐藏没有数据的 X 类别你好@anne_sa ,
正如您所发现的,图形生成器会观察分组变量的这些类别,并且确实会坚持绘制它们(这通常是一件好事),因为它假设您发现它们的价值,因为您将它们保存在表中。 在使用列切换器的情况下,它并不像删除这些行那么简单,因为其他列数据确实存在。 一种解决方案是重组数据,以便消除那些丢失的行。 我会通过堆叠来做到这一点:
表 > 堆栈
Data Table( "Test" ) << Stack(
columns( :Y, :Y 2 ),
Source Label Column( "Label" ),
Stacked Data Column( "Data" )
);
这将返回如下表:

通过右键单击任何缺失的单元格 > 选择匹配来删除缺失值。 然后,删除这些行。 这将返回附表。 现在,制作图表,但使用本地数据过滤器而不是列切换器来选择以前来自标签列的响应:
Graph Builder(
Show Control Panel( 0 ),
Variables( X( :GROUP ), Y( :Data ) ),
Elements( Bar( X, Y, Legend( 4 ) ) ),
Local Data Filter(
Add Filter(
columns( :Label ),
Where( :Label == "Y" ),
Display( :Label, Size( 160, 17 ) )
)
)
);

由于没有丢失行,图形生成器仅显示填充了数据的组级别。当然,您可以将其推广到任意数量的 Y 级别——只需在初始步骤中将所有级别堆叠起来即可。
我希望这有帮助!
@朱利安
回复:图形生成器:隐藏没有数据的 X 类别嗨安妮,
我现在看到了你的问题,并且还在考虑它。 我相信这需要一点编码。回复:图形生成器:隐藏没有数据的 X 类别感谢您的回答@geoffrey_mann
不幸的是,这并不正是我想要得到的,因为当我使用列切换器选择新列时,本地数据过滤器仍然基于 Y。
当然,可以手动更改本地数据过滤器,但由于我可以拥有相当多的变量,因此如果有一种自动方法来执行此操作会很棒:)
回复:图形生成器:隐藏没有数据的 X 类别嗨安妮,
您认为需要“where”子句或更确切地说某种过滤器的想法是正确的。 尝试将以下行添加到您的 graphbuilder 脚本中:
Local Data Filter( Add Filter( columns( :Y ), Where( :Y >= 2 & :Y <= 7 ) ) )
我希望本地数据过滤器可以吗?
Graph Builder(
Size( 527, 448 ),
Show Control Panel( 0 ),
Variables(
X( :GROUP, Order By( :Y, Ascending, Order Statistic( "Mean" ) ) ),
Y( :Y )
),
Elements( Bar( X, Y, Legend( 4 ) ) ),
Column Switcher( :Y, {:Y, :Y 2} ),
Local Data Filter( Add Filter( columns( :Y ), Where( :Y >= 2 & :Y <= 7 ) ) )
);
回复:图表构建器:隐藏没有数据的 X 个类别虽然帖子比较老了,但或许仍然能提供一些帮助:
您还可以使用本地数据过滤器,选择缺失值和相应 Y 的反向值。
Local Data Filter(
Inverse( 1 ),
Add Filter( columns( :Y1, :Y2 ), Select Missing( :Y2 ) )
),
Column Switcher( :Y2, {:Y1, :Y2, :Y3} )
此外,您还可以添加一个事件,用于在选择列切换器的另一级别时触发,该事件会更改所有您感兴趣的 Y 变量的本地数据切换器筛选器设置。这可能有点过度设计,但或许可行。
回复:图表构建器:隐藏没有数据的 X 个类别嗨@martindemel ,
谢谢你的留言。虽然这是一篇比较老的帖子,但能发现实现同一目标的不同方法总是令人欣喜的。