在之前的一個郵政,您了解了 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!