在之前的一个邮政,您了解了 Graphlet 预设和粘贴 Graphlet 命令。 我们向您展示了它们如何支持悬停标签中的上下文感知、可点击可视化缩略图。 这些命令实现了 JMP 15 悬停标签扩展功能的“瓷器”方面,提供了不需要任何编码技能的用户友好界面。
在这篇文章中,您将更好地了解为瓷层提供动力的底层“管道”层。 该层被设计为一个框架,也可以由用户直接访问,从而允许实现瓷器功能未涵盖的需求。
悬停标签扩展框架
框架是基本服务和扩展点的组合。 从框架的角度来看,预设和自定义 graphlet 是相同的,所以唯一的区别是联合管理计划提供预设定义以方便用户。
在框架级别,所有 graphlet(包括预设)都使用集合图谱命令,但每个预设都会使用一组不同的参数来初始化框架。 这些参数包括 JSL 脚本片段,稍后用作回调。 该框架评估这些回调以响应用户交互,例如将鼠标悬停在视觉元素上或单击悬停标签缩略图。
回调评估发生在悬停标签执行上下文(HLEC),它捕获有关底层视觉元素的上下文信息。 回调可以利用此上下文信息来实现动态行为。 以直方图预设为例。 查看上下文以找到基线可视化 Y 角色分配后,它会重用该列进行自己的 Y 角色分配。
悬停标签扩展框架的其他入口点包括粘贴图形(Set Graphlet 的包装),设置文本, 和设置小烤盘。 在这篇文章中,我们将使用“设置图形”命令作为示例,但相同的原则也适用于其他命令。
创建自定义 graphlet 的最佳方法是使用悬停标签编辑器对话。 您还可以使用悬停标签编辑器来检查图形基元预设的定义方式。 预设定义提供了如何使用框架功能的很好示例。

Graphlet 回调
悬停标签编辑器 Graphlet 面板公开了一些脚本参数,其中最重要的是“图片”和“单击”。 框架将在运行时调用它们以响应以下事件:
- 悬停:当用户将鼠标指针放置在可视元素上一小段时间时(例如,当用户将鼠标悬停在条形图中的条形上时),将执行图片脚本片段。 这样做的结果是生成一个 PictureBox(展示盒包含图形图片对象)或显示树包含一个 PictureBox。 如果脚本调用平台的执行,它将在一个不可见的窗口内启动。 然后,框架将遍历结果的显示树,然后捕获并缩小遇到的第一个 PictureBox 的屏幕截图。 该图像将成为悬停标签内显示的缩略图。
- 点击:当用户左键单击悬停标签图形缩略图时,会触发可选的 Click 参数。 如果它不存在,则重用图片脚本,但执行包含的平台会产生可见窗口。 这就是预设启动可视化的方式。
Click 回调可以执行任意 JSL 脚本。 例如,它可以打开网页、进行 REST 调用、从磁盘加载文件以及更新表。 它允许与外部数据、系统和其他高级场景集成。
如前所述,回调的评估发生在执行上下文内,执行上下文有两个组成部分:
- 本地数据过滤器,对行进行子集化以匹配视觉元素数据。
- 捕获视觉元素属性的本地命名空间。
本地数据过滤器
图中的每个视觉元素对应于原始数据的一个子集。 例如,让我们看一下显示按性别划分的学生平均身高的条形图。 第一个栏对应的是女学生;第二个是针对男性的。 这种隐式分组发生在可视化定义期间。
该框架通过等效的方式使分组变得明确本地数据过滤器(LDF),用于限制回调执行期间可见的数据表行。 LDF 定义基于:
- 基线可视化图表类型。
- 分配给其分组角色的列(X、组 X/Y、叠加等)。
- 与这些列关联的值。
在下面的示例中,基线图是一个小的倍数条形图。 该框架根据其两个分组变量将其映射到 LDF:
- 分配给 X 角色的人(年龄)。
- 分配给 Y 组(性别)的人。
请注意悬停栏和包含图表的面板如何生成过滤器值。

通过以下方式可以对列包含进行额外控制跳过过滤器属性。 虽然很少有必要,但如果您想要显示比通常与底层视觉元素关联的数据更多的数据,它可能会很有用。
背后的核心机制向下钻取是启动具有基于上下文的 LDF 的平台以响应用户交互的能力。
本地命名空间
HLEC 的第二个组成部分是本地命名空间。 其主要目的是将上下文信息暴露给 graphlet,这允许 graphlet 表现出动态的、上下文感知的行为。 该框架在执行之前将每个 graphlet 回调包装在本地命名空间中。
图基元局部命名空间由框架用局部变量填充。 这些上下文变量遵循命名约定,这意味着它们的名称必须始终以下划线开头。 它们从与当前执行上下文相关的不同来源捕获信息:
- 悬停视觉元素类型(条形、标记等)。
- 关联数据第一行的索引。
- 相关数据中的观测值数量。
- 将鼠标悬停在标签网格条目上(每个条目一个变量)。
- 回调类型(图片、点击等)。
- LDF where 子句。
- 向下钻取级别很重要。
在调试时检查新 graphlet 值的一种简单方法是使用 Textlet 上下文预设,它将值作为文本添加到悬停标签本身,如下所示:

把它们放在一起
下图显示了框架的不同部分如何在执行 graphlet 预设时组合在一起。 在自定义 graphlet 中,用户使用 Picture 脚本参数提供图形模板。

首先,框架在配置时捕获图形模板和其他参数。 随后,为了响应用户交互,它会创建作为 HLEC 一部分的过滤器和命名空间。 它实例化 HLEC 内的模板以生成悬停标签缩略图。 如果用户单击该图像,它将在自己的窗口上启动关联的平台。
自定义 graphlet 示例
现在您已经了解了其中的机制,下面是一个示例,说明访问底层 graphlet 框架如何帮助用户解决实际问题。
不久前,有网友在本站提问JMP 用户社区。 她有一个文件夹,里面有她实验的图像文件(特别是高分辨率图片)。 她想要在悬停标签中显示与实验相关的图像,但这些图像太大,无法存储在她的 JMP 表中。 是否可以按需从磁盘加载它们?
实现这一目标存在一些障碍。 它与任何现有的预设都不相符,它不太适合 Paste Graphlet,因为它需要动态行为,并且显示图像的文件名必须根据需要计算。
解决方案是通过使用基于 JSL 文件原语的回调扩展框架来创建自定义 graphlet。
下面基于 Iris 数据集的示例显示了该解决方案的原理。 该示例的关键部分是展示如何直接从磁盘加载图像。 文件名基于 HLEC 本地命名空间变量之一。 作为奖励,您可以了解如何打开相关网页以响应用户单击显示的图像。
Set Graphlet(
// Value from hover label grid entry (labeled column)
Picture(
Picture Box( Open( img_dir || local:_Species || ".jpg", "jpg" ) )
),
// Value from data table using column reference for visualized row
Click(
Web( "https://en.wikipedia.org/wiki/Iris_" || Column( "Species" )[local:_firstRow] )
)
)

结论
虽然我们希望您始终能够使用预设和粘贴 graphlet 来实现您的大部分要求,但我们意识到这并不总是可行。 通过使用该框架,您可以在有特殊需要时创建自己的自定义悬停标签扩展。
如果您有疑问,想要分享您的创作,或者只是看看其他用户的想法,请加入我们的JMP 用户社区。 我们期待看到您的下一个很酷的 graphlet!