圓餅圖+熱圖大家好,
作為一名海洋生物學家,我最近偶然發現了我非常喜歡的珊瑚礁數據的視覺呈現(見附件)。 在其中,您將看到各種餅圖,其中各個楔形本質上是熱圖,用於顯示某些參數的相對水平。 我想將其應用於我自己的研究,並且我認為它可以使用圖形生成器來完成,儘管本身不是作為熱圖。 這是我的想法:假設我想要四個代表四個反應變數(A、B、C 和 D)的餅圖。 大小並不重要,所以我會給每個值 0.25,以便它們佔據相同的面積。 我意識到我可以疊加顏色,因此我創建了一個“顏色”列並為四個響應變數分配了值,但隨後我的圖表沒有相應更改。
我嘗試過價值著色和標籤,但沒有運氣。 我覺得我剛剛把桌子擺錯了! 有什麼建議麼?? 謝謝!
回覆:餅圖+熱圖安德森,
這裡使用人體範例:使用 JMP 分析個人飲食和健身數據和這裡:使用自訂地圖作為選擇過濾器來對 JMP® 12 中的鍛鍊資料進行子集化和探索圖表
我看到你的2020 年美洲探索高峰會演講記錄 :預測珊瑚礁的命運 (2020-US-45MP-615)但我很期待看到它的現場表演!
〜約翰
回覆:餅圖+熱圖約翰,
這太棒了,我完全打算觀看本週的演講(它在我的日程安排中)。 我認為這種能力以及“graphlet”將為將數據疊加到Graphbuilder 圖形上以及將數據繪製到自定義圖形上打開各種大門(就像我們之前討論的人體示例,可以在JMP 網站上的某個位置找到)我相信是教程的形式)。 我很想知道是否有人在美學方面有任何建議。 我個人喜歡餅圖,但也許有更好的方法我們甚至沒有考慮? 我也喜歡你關於電子遊戲風格「健康條」的想法。
想想看,也許這可以讓流行病學家受益。 例如,如果您將感染率疊加在經緯度網格上,然後在等高線圖上固定楔形圖/餅圖以及有關患者或患者組的附加信息,則您可能會添加一層複雜性,而使用這種方法可能無法實現這一點標準 GraphBuilder 功能(我想對於大多數類型的數據,graphlet 也適用於此)。
回覆:餅圖+熱圖這次討論啟發我為 JMP Discovery Americas 2020 撰寫論文和簡報。當海洋生物學家、電子遊戲和 JMP 結合在一起時,您會得到什麼? (2020-US-45MP-543)
當我準備論文時,我有時間對這篇文章中描述的技術進行實驗和改進。
本文包含一些資源(自訂地圖和範例)以及有關如何使用它們的詳細說明。
我希望您會發現這篇文章和我的論文很有用。
謝謝,
〜約翰
回覆:餅圖+熱圖安德森,
圖形產生器不提供將長條圖或圓餅圖放置在地圖上特定位置的方法。 您可以透過以下方式繞過它:
- 從圖形產生器圖形建立一個表,在其中使用地圖角色中的樣本編號(使用長條圖或自訂地圖形狀建立)。 這將建立一個包含樣本編號列和每個樣本的圖像列的表。
- 將生成表中的影像列複製回未堆疊資料表(確保影像列與樣本編號的順序相符。 **
- A。標記影像列或 b。 為影像列設定「用作標記」。
- 使用非堆疊資料表,使用鹽度或臨時列作為顏色角色在圖形產生器中建立等高線圖。
- 新增點元素。可選擇使用其他顏色角色。
- 如果您按照步驟 3.a 操作,圖像將顯示在懸停標籤中。 您可以固定一些懸停標籤並替換文字以刪除任何不需要的懸停標籤文字。
- 如果您按照步驟 3 b 進行操作,所有標記將與影像列中的影像一起顯示。 這可能會導致顯示混亂,您可以透過放大或刪除重疊的影像來解決。
** 我發現它們的順序不同,並且在複製圖像列之前必須進行排序。 事後看來,我意識到我可以使用聯接或虛擬聯接來將映像放在正確的行上。 我希望我能先讀這個: https://community.jmp.com/t5/JSL-Cookbook/Geographic-Maps-with-Graphs-as-Markers/ta-p/53782。
我在這裡發布了 3.a 和 3.b:
https://public.jmp.com/packages/Heat-contour-with-image-annotations/js-p/5d64597acf28b80f980812ba

關於我用來繪製條狀的方法。 我沒有使用自訂地圖,而是使用自訂圖形腳本來計算條形的長度並將它們放置在每個點上方。
當談到精簡時,JSL 通常是最佳選擇。
〜約翰
回覆:餅圖+熱圖約翰,
這很棒! 您認為它可以直接在圖形生成器中完成還是需要腳本和高級知識才能完成? 我知道我可以修改腳本,但我只是想簡化它,如果我在餅圖上使用這個選項來處理大量的資料。 它是否需要自訂形狀,或者您是否手動將所有這些圖示固定在地圖中?
回覆:餅圖+熱力圖不客氣,安德森和DS。
我發布了一個更好的自訂圖形腳本範例,該腳本可以標註地圖上每個點的三個變數。

它位於 JMP Public 上。只需點擊以下連結:
https://public.jmp.com/packages/5d605bce3560ce0d2cafd48b
我用簡單的長條圖(粗線)來表示每個資料點的三個預設儲存格值。餅圖需要更多步驟,但我只是想先展示這個概念驗證。 JSL 腳本可在 JMP Public 的貼文詳情中查看和下載。
約翰
回覆:餅圖+熱圖哇! 這很棒。 感謝約翰提供的所有幫助和資訊。 我不知道自訂地圖功能的存在,所以我在那個「兔子洞」裡待了一兩天,只是想著我可以用它來將數據繪製到我研究的珊瑚的追蹤圖像上(遺憾的是,不過,我很少在同一個群體內採集大量樣本,儘管這絕對是一個次要的專案想法,而且這將是展示研究結果的一種很酷的方式)。
我認為能夠將資料繪製到任何類型的形狀、圖像等上絕對是更多人應該了解的 JMP 功能,並且我建議將來將其作為包中的實際功能(而不是作為加載項,儘管該加載項目前工作正常)。
致 DS:我實際上只是考慮在 JMP 中製作餅圖和地圖(一旦完成一兩次,使用 JMP 在地圖上繪製數據就非常簡單),然後使用 Adobe 製作圖形類型在我的原始帖子中已顯示,但JMP 有方法在繪圖上註釋資料點,晚上將影像固定到它們上。 因此,透過一些練習和工作,您很可能在我最初在 JMP 中發表的文章中製作出幾乎整個地圖+數據圖。 事實上,我可能會在接下來的幾週內嘗試這樣做。
再次感謝約翰提供的解決方案!
回覆:餅圖+熱圖你好@約翰_鮑威爾_JMP ,
感謝您的附加資訊。 我已為此討論添加了書籤,以便我可以將其存檔,然後也可以返回重新閱讀您發送的附加資訊。
抱歉,我擔心我可能沒有解釋將您的帖子標記為解決方案的含義 - 我認為我不能,因為我不是原始發文者(因此沒有該選項),而不是因為您沒有解決熱圖。 如果是這樣讀的話,我很抱歉——我回去重新讀了一遍,聽起來確實有點像我那樣說的(對我來說不太好)。
我熟悉 JSL 並將其用於許多其他事情,但還沒有嘗試使用它進行像這樣的自訂圖形,所以這將是我學習的新領域!
謝謝!,
DS回覆:餅圖+熱力圖感謝你的讚揚@SDF1 。
你說得對,我沒有完全回答關於將這些圖形疊加到背景地圖上的問題。
在地圖上疊加圖像需要不同的機制,例如使用「自訂」對話方塊中的腳本: 
這裡提供了一些範例腳本:

您可以在這裡找到有關自訂功能的資訊:
https://www.jmp.com/support/help/14-2/customize-graphical-elements.shtml
以下是一個使用圓形的簡單範例:

回覆:餅圖+熱圖你好@約翰_鮑威爾_JMP ,
感謝您快速而清晰的回覆。 在收到您的回覆之前,我重新閱讀了原始帖子,意識到我瀏覽得太快並註意到最後五欄的提及。
然後,我從 JMP Public 下載了您的內容,並詳細查看了其中的詳細信息,並注意到標籤列屬性對地圖形狀的引用。 我過去沒有探索過這種可能性,所以我一直在閱讀並嘗試你的地圖。 很酷!
我希望也許還能在背景中覆蓋世界地圖上收集資料的經度/緯度位置——就像原始海報中的範例一樣。 不過,我認為這超出了圖形產生器所能完成的範圍;不過那會很酷。 這是一個很好的可視化想法。 是的,我絕對可以看到這對我的工作有什麼幫助。 我在一些數據上對其進行了測試,我所要做的就是調整形狀 ID 的名稱,並且它有效。 很好謝謝!
順便說一句,我會將您的帖子標記為解決方案(至少對於餅圖而言),但我認為我無法做到這一點。 JMP 能否像原始海報所希望的那樣同時繪製餅圖和輪廓圖(或熱圖)?
謝謝!,
DS回覆:餅圖+熱圖我堆疊的列名為:Sym GE HMS、host GE HMS、菌落顏色、變異性和匯總異常指數。 在 JMP Public 貼文所附的表格中,它們現在位於名為「回應」的欄位下,每個回應的標籤(舊欄位名稱)位於「標籤」欄位中。
JMP 不會自動建立截面「靶心」圖表。 涉及幾個步驟:
- 我創建了 JMP 公共發布中提供的自訂地圖形狀文件,用於定義剖面和靶心。
- 在圖形產生器中,我將“標籤”列拖曳到“形狀”角色(左下角),該角色顯示了自訂形狀的輪廓。
- 為了套用顏色,我將「回應」列拖曳到「顏色」角色(右側)。 這將用每個部門的平均響應填充形狀。
- 為了分離每個樣本,我將樣本編號列拖曳到「包裹」角色(右上角)中。
我不能把這個好的視覺化想法歸功於我。 它來自原始海報。
我很高興看到它也可以幫助你。
〜約翰
回覆:餅圖+熱圖你好@約翰_鮑威爾_JMP ,
我真的很想嘗試一下,看看我是否可以將其調整到我的業務所做的一些報告中。
您提到您按感興趣的列堆積起來,但那些是哪些? 我下載了資料表,但無法弄清楚需要堆疊哪些列。 並且,JMP 是否自動將餅圖產生為截面“靶心”,或者這是一個單獨的設定。 我以前從未見過這樣的人。 這是一個很好的視覺化,對我來說是新的,這就是我對此感到好奇的原因。
謝謝!,
DS回覆:餅圖+熱力圖將感興趣的列堆疊起來,可以使用自訂地圖來實現您想要的視覺效果。
以下是使用您提供的資料在 JMP public 上的範例。
您可以在以下位置找到自訂地圖和修改後的資料表:
https://public.jmp.com/packages/5d5aa110f40f010268e63cf4
約翰
回覆:餅圖+熱圖我仍然感到困惑,所以我想我應該附上實際的數據文件。 基本上,我想將最後五列放入餅圖中,其中楔形顏色反映單元格中的顏色(由樣本編號包裹)。 我開始認為這對圖形生成器來說可能是不可能的...
回覆:餅圖+熱力圖你好 ,
我加入討論的時間比較晚,但我正在嘗試創建非常類似的圖表。我對“3.b”方案特別感興趣,因為我想在歐洲範圍內以網格形式顯示餅圖(在這種情況下,標籤樣式完全無法閱讀)。
重點是,當我使用圖表作為標記時,背景是白色的,這在地圖上看起來不太好:它們往往會在角落重疊。
雖然我可以透過調整餅圖大小來縮小白色區域,但白色背景仍然可見。請問在 JMP 17 中有什麼方法可以使這個背景透明或完全移除它嗎?
約翰娜
回覆:餅圖+熱力圖嗨@johanna_younous ,
歡迎加入討論。
我剛開始參與這個討論的時候,我的圖表背景也是白色的。
在我做上面提到的演示時,我已經弄清楚如何使背景透明了。
我使用以下 JSL 腳本將圖像表中名為“Graph”的列中的白色像素變為透明。
dt=CurrentDataTable();
For Each Row(
{r, g, b} = dt:Graph[] << getpixels( "rgb" );
a = !AND(r == g, g == b);
dt:Graph[] << setpixels( "rgba", {r, g, b, a} );
);
這樣一來,當紅色、綠色和藍色分量完全相同時,灰色像素也會變得透明。我的背景中也有一些灰色。
希望這對你有幫助。
約翰
回覆:餅圖+熱力圖謝謝@John_Powell_JMP ,
遺憾的是,這個循環對我來說並不完全有效,我正在努力弄清楚原因。
當我運行完整循環時,圖表上的白色背景並沒有被移除:
);
dtgraph= Graphbuild<< Make Into Data Table( );
For( i=1, i <= nrows(dtgraph) , i++, //i=3
img =dtgraph:Graph[i] ;
{r, g, b} = img << getpixels( "rgb" );
// Pixel coloré → alpha = 1 (opaque)
// Pixel gris/blanc/noir (r==g==b) → alpha = 0 (transparent)
a = ! (r==g==b);
Wait(0);
img << setpixels("rgba", {r, g, b, a});
Wait(0);
dtgraph:Graph[i] = img;
);
但是如果我一步一步執行,更新就能成功應用到第一行!
img =dtgraph:Graph[1] ;
{r, g, b} = img << getpixels( "rgb" );
// Pixel coloré → alpha = 1 (opaque)
// Pixel gris/blanc/noir (r==g==b) → alpha = 0 (transparent)
a = ! (r==g==b);
Wait(0);
img << setpixels("rgba", {r, g, b, a});
Wait(0);
dtgraph:Graph[1] = img;
這件事快把我逼瘋了。我猜可能是更新時間的問題,或是跟「表達式類型」列有關?
非常感謝您的任何見解 
約翰娜
回覆:餅圖+熱力圖雖然這個方案(以及其他許多方案)頗具創新性,但我不得不說,我覺得餅圖實在沒什麼用(這讓我想起塔夫特的一句名言,我記不清他具體是在哪裡說的了,所以這裡就簡單概括一下:「唯一比一個愚蠢的餅圖更糟糕的,就是不止一個愚蠢的餅圖。」)。通常來說,甜甜圈圖比餅圖好,但我覺得在這種情況下,長條圖的效果要好得多。在進行四個維度的多重比較時,有兩個問題:首先是各個部分的排序,其次是每個部分的大小。長條圖比圓餅圖更容易排序,而且長條圖的大小也更合適。或許還有其他更好的展示方式,但我真的覺得這些圓餅圖很難理解。
回覆:餅圖+熱力圖同時,我竟然以一種最出人意料的方式讓它運行起來了(正如我可以證明的那樣,這個腳本真的非常不理想,我經歷了漫長的測試和失敗過程)。
dtgraph= Graphbuild<< Make Into Data Table( );
For( i=1, i <= nrows(dtgraph) , i++, //i=6;
img =dtgraph:Graph[i] ; //
img1=char(img);
{r, g, b,a1} = img << Get Pixels( "rgba" );
a2 = !AND(r == g, g == b);
Wait(0);
eval(parse( "img << set Pixels(\!"rgba\!", {r, g, b, a2})" ));
img2= char(img);
print(img1==img2);
Wait(0);
dtgraph:Graph[i] = parse(char(img2));
img=empty();
);
print("fin loop1");
//exact same loop !!
For( i=1, i <= nrows(dtgraph) , i++, //i=6;
img =dtgraph:Graph[i] ; //
img1=char(img);
{r, g, b,a1} = img << Get Pixels( "rgba" );
a2 = !AND(r == g, g == b);
Wait(0);
eval(parse( "img << set Pixels(\!"rgba\!", {r, g, b, a2})" ));
img2= char(img);
print(img1==img2);
Wait(0);
dtgraph:Graph[i] = parse(char(img2));
img=empty();
);
print("fin loop2");
// log output
1
1
1
1
1
1
"fin loop1"
0
0
0
0
0
0
"fin loop2"
這確實是一種非常非常奇怪的行為,但既然有效,那就這樣吧:我在這個問題上花了太多時間^^
我仍然對這種現象的任何解釋都非常感興趣。
回覆:餅圖+熱力圖我同意你的觀點,但是,由於利益相關者的要求……那就用餅圖(甚至更糟的是,雷達圖)吧!
回覆:餅圖+熱力圖@johanna_younous ,
很高興你找到了解決方案並與社群分享,但我同意可能有更簡單、更有效率的解決方案。 「For Each」循環或許比「For」循環更有優勢。
我很驚訝地發現你在 Get Pixels 函數中使用了“rgba”,但也許在運行一次腳本後,圖像中的像素就具有 alpha 分量了。
在我使用腳本的情況下,圖片位於單獨的資料表中,並透過虛擬連線進行關聯。這可能與您的情況不同,因此圖片變更對我來說會立即生效。
或許社群裡有比我更有 JMP 腳本編寫經驗的人能夠提供更簡單的解決方案或解釋。
謝謝,
約翰