饼图+热图大家好,
作为一名海洋生物学家,我最近偶然发现了我非常喜欢的珊瑚礁数据的视觉呈现(见附件)。 在其中,您将看到各种饼图,其中各个楔形本质上是热图,用于显示某些参数的相对水平。 我想将其应用于我自己的研究,并且我认为它可以使用图形生成器来完成,尽管本身不是作为热图。 这是我的想法:假设我想要四个代表四个响应变量(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 脚本编写经验的人能够提供更简单的解决方案或解释。
谢谢,
约翰