How can you show the RGB color coordinates of crayons in an interesting way using JMP? (Image copyright James A. Alloway, Jr. Used with permission.)How can you show the RGB color coordinates of crayons in an interesting way using JMP? (Image copyright James A. Alloway, Jr. Used with permission.)How can you show the RGB color coordinates of crayons in an interesting way using JMP? (Image copyright James A. Alloway, Jr. Used with permission.)How can you show the RGB color coordinates of crayons in an interesting way using JMP? (Image copyright James A. Alloway, Jr. Used with permission.)如何使用 JMP 以有趣的方式显示蜡笔的 RGB 颜色坐标? (图片版权 James A. Alloway, Jr. 经许可使用。)
工程邮袋
第 2 集:我看到你的本色
JMP Systems 工程师时不时地遇到一些有趣的问题,这些问题在某种程度上超出了典型的范围JMP用法。 这些应用程序通常很聪明,让人们明白使用数据不仅仅是为了解决业务或技术问题。 下面是来自纽约州的另一位同事的一个例子,我认为分享它会很有趣。
作为志愿者工作的一部分,Jim 试图分析 150 支 Crayola 蜡笔的数据。 他希望向学生展示炫酷的数据可视化,激发他们对 STEAM(科学、技术、工程、艺术与设计和数学)的兴趣。
问题
嗨,迈克 [JMP],
我终于有一个问题要问你了。 我正在为 STEAM 演示文稿创建数据集。 对于艺术与设计部分,我有 Crayola 蜡笔(150 行)的数据。 我正在尝试使用每行(颜色)的颜色坐标(R,G,B)创建一个三元图。 我可以毫无困难地创建绘图,但我希望绘图上的每个标记都是每行中表示的实际颜色。 我已经能够手动完成此操作,但我认为必须有更简单的方法(无需编写脚本)。
在此方向上的任何指导将不胜感激! (此时不着急。)
谢谢。
吉姆 [用户]
我的回复
试试这个。<附数据表>
好吧……那是一次信息交流,不是吗?
这是极少数情况下的一个例子,在这种情况下,唯一的方式是向某人展示如何做某事就是实际上做它为他们。 我通常不喜欢这样做,但有时这是最好的方法。 是的,在这种情况下,答案是脚本。 让我们花点时间浏览一下数据和我所做的。 吉姆提供的数据(可用这里)看起来像这样:
Jim's original data tableJim's original data tableJim's original data tableJim's original data table吉姆的原始数据表
我们看到的是蜡笔名称的列和该颜色的 HSV RGB 坐标。 我实际上并没有将 HSV 坐标用于我的解决方案。 Jim 想找出一种方法,以编程方式为行状态分配颜色匹配 RGB 坐标描述的颜色. (如果这听起来很复杂,坚持下去——还不错。)这是我发回的数据表:
My data tableMy data tableMy data tableMy data table我的数据表
请注意我包含的表脚本(在左侧绿色箭头旁边)。 第一个是魔法发生的地方。 其他的是一些有趣的分析,我稍后会讲到。
好吧,Tickle Me Pink!
首先,让我们来看看这个着色业务。 取决于你想做什么, JMP需要不同格式的 RGB 坐标。 使用单元格颜色(列中颜色名称的背景)和行状态颜色需要在 0 和 1 之间缩放 RGB。 因此,因为我试图对我所做的事情保持透明,所以我创建了一组列(红色、绿色、蓝色)以将 RGB 坐标从 8 位色标 (0-255) 重新缩放到 0 到 1 之间. 表格脚本“Color Cells”会做两件事。 首先,它使用对于每一行()循环和 :Color名称 << 颜色单元格()设置单元格颜色的消息。 然后,再次为了透明度(可能是因为我在几天的时间里做了这个——老实说,我不记得是哪一个了),我使用了第二个步骤,包括为了()循环使用我创建的列设置行状态。
Names Default To Here( 1 );
dt = Current Data Table();
dt << Clear Select;
For Each Row(
// get RGB values
red = Column( "Red" )[Row()];
green = Column( "Green" )[Row()];
blue = Column( "Blue" )[Row()];
// color the "sample" column cell with the sample color
:Color Name << Color Cells( RGB Color( red, green, blue ), Row() );
);
For( i = 1, i <= N Rows(), i++,
// get RGB values
red = Column( "Red" )[i];
green = Column( "Green" )[i];
blue = Column( "Blue" )[i];
dt << Select Rows( i );
dt << Colors( RGB Color( red, green, blue ) );
dt << Clear Select;
);
运行此脚本会创建我发回给吉姆的彩色表格。
现在,虽然这张表非常丰富多彩,但使用此类数据确实需要一些强大的可视化效果。 由于 RGB 是三元坐标空间,因此 Ternary Plot 似乎是一个合适的起点:
A Ternary Plot is a good place to start.A Ternary Plot is a good place to start.A Ternary Plot is a good place to start.A Ternary Plot is a good place to start.三元图是一个很好的起点。
行状态着色提供了每支蜡笔在 RGB 颜色空间中所处位置的清晰图片。 我还应该指出买者自负关于此应用程序中三元图的使用。 严格来说,“三元图”平台期望为每个坐标提供的三个值总和为 1。 当提供的数据不符合此标准时,它会对数据点进行归一化。 因此,虽然三元图非常简洁,但它并不是色彩空间的 100% 准确表示。 然而,由于练习的目的是制作一些能激发 STEAM 兴趣的图形,我认为用一点准确性来换取视觉冲击力是可以的……
从分析上讲,可以使用层次聚类根据颜色的相似程度对蜡笔进行分组。 在这里,我展示了星座图,这是我最喜欢的查看树状图的方式,通过在 RGB 空间坐标上运行层次聚类:
A Constellation Plot produced by performing Hierarchical Clustering on the data.A Constellation Plot produced by performing Hierarchical Clustering on the data.A Constellation Plot produced by performing Hierarchical Clustering on the data.A Constellation Plot produced by performing Hierarchical Clustering on the data.通过对数据执行层次聚类生成的星座图。
从这里,我可以看到大约有 5 到 7 组颜色。 我将聚类数设置为 5,然后查看平行图。 集群中的差异很容易看出,集群内的相似性也很容易看出。 我发现有趣的是,柔和和日光颜色被放入它们自己的簇(簇 2 和 3)中。
The pastel and day-glow colors were put into their own clusters (clusters 2 and 3).The pastel and day-glow colors were put into their own clusters (clusters 2 and 3).The pastel and day-glow colors were put into their own clusters (clusters 2 and 3).The pastel and day-glow colors were put into their own clusters (clusters 2 and 3).柔和色和日光色被放入它们自己的簇中(簇 2 和 3)。
您可以使用 k-Means 聚类脚本看到类似的结果。
后记
与往常一样,在放下一段时间后重新审视某件事会提供一个新的视角。 自从吉姆最初联系我以来,我已经多次重新访问了这个数据集。 我能说什么? 我是个书呆子,这是一个有趣的小数据集。 首先,在写这篇文章的过程中,我意识到我把这段代码写得比我需要的复杂得多。 整个着色操作可以使用一个单一的对于每一行()环形。 我还可以通过创建列表并转换列表来简化编码,以获得 JMP 需要的坐标集,而无需创建新列。
Names Default To Here( 1 );
dt = Current Data Table();
dt << Clear Select;
For Each Row(
// get RGB values
r = Column( "R" )[Row()];
g = Column( "G" )[Row()];
b = Column( "B" )[Row()];
rowVal = {r, g, b};
// create a scaled set of colors
rowValS = rowVal/255;
// color the "sample" column cell with the sample color
:Color Name << Color Cells( RGB Color( rowValS ), Row() );
// apply a row state to each row
dt << Select Rows( Row() );
dt << Colors( RGB Color( rowValS ) );
dt << Clear Select;
);
其次,我非常喜欢 Jim 原始数据集中的三元图(撇开准确性问题)。 这让我开始思考如果我生成一个空间填充示例来映射 RGB 空间中的所有组合会发生什么。 我想出的脚本相当复杂。 我将它上传到文件交换作为RGB 色彩空间映射如果你想看看。 无论如何……它生成的三元图令人印象深刻。 回想起来,也许我应该将这篇文章命名为“月之暗面”。
This is what happened when I generated a space-filling example that mapped out all the combinations in the RGB space.This is what happened when I generated a space-filling example that mapped out all the combinations in the RGB space.This is what happened when I generated a space-filling example that mapped out all the combinations in the RGB space.This is what happened when I generated a space-filling example that mapped out all the combinations in the RGB space.这就是当我生成一个映射出 RGB 空间中所有组合的空间填充示例时发生的情况。编者按:你读过我们工程邮袋系列的第一期? 查看 Mike 如何帮助正在使用的用户JMP决定是否报名参加除雪服务。
作者的话
对于那些再次阅读这篇文章的人来说,不,你没有疯,标题确实改变了一点。我收到了更新标题的请求,以便我们的搜索引擎更容易找到它。我只能猜测这是因为一些搜索引擎是 19 世纪参考图书馆员的现代化身,没有幽默感。如有任何不便,我们深表歉意。-M