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 系统工程师时不时会遇到一些超出典型范围的有趣问题JMP用法。 这些应用程序通常很聪明,并且带回家如何使用数据不仅仅用于业务或技术问题。 下面是来自纽约州的另一位同事的一个例子,我认为分享它会很有趣。
作为志愿者工作的一部分,吉姆试图分析 150 支 Crayola 蜡笔的数据。 他希望向学生展示酷炫的数据可视化,激发他们对 STEAM(科学、技术、工程、艺术与设计和数学)的兴趣。
问题
嗨,迈克 [JMP],
我终于有一个问题要问你。 我正在为 STEAM 演示文稿创建一个数据集。 对于艺术与设计部分,我有 Crayola 蜡笔(150 行)的数据。 我正在尝试使用颜色坐标(R,G,B)创建一个三元图,我对每一行(颜色)都有。 我可以毫无困难地创建绘图,但我希望绘图上的每个标记都是每行中表示的实际颜色。 我已经能够手动完成此操作,但我认为必须有一种更简单的方法(无需编写脚本)。
任何朝这个方向的指导将不胜感激! (此时并不着急。)
谢谢。
吉姆 [用户]
我的回复
试试这个。<附数据表>
嗯……那是一次信息交流,不是吗?
这是向某人展示的唯一方法的罕见情况之一的示例如何做某事就是实际上做它为他们。 我通常不喜欢这样做,但有时这是最好的方法。 是的,在这种情况下,答案是脚本。 让我们花点时间浏览一下数据和我做了什么。 吉姆提供的数据(可用这里) 看起来像这样:
Jim's original data tableJim的原始数据表
我们看到的是蜡笔名称的列和该颜色的 HSV RGB 坐标。 我实际上并没有将 HSV 坐标用于我的解决方案。 Jim 想找到一种以编程方式为行状态分配颜色的方法匹配由 RGB 坐标描述的颜色. (如果这听起来很复杂,请稍等——这还不错。)这是我发回的数据表:
My data table我的数据表
请注意我包含的表格脚本(在左侧的绿色箭头旁边)。 第一个是魔法发生的地方。 其他是一些有趣的分析,我稍后会谈到。
好吧,给我挠痒痒粉红!
首先,让我们看看这个着色业务。 根据您要执行的操作, JMP需要以不同方式格式化 RGB 坐标。 使用单元格颜色(列中颜色名称的背景)和行状态颜色需要 RGB 在 0 和 1 之间缩放。 所以,因为我试图让我所做的事情变得透明,所以我创建了一组列(红色、绿色、蓝色)来将 RGB 坐标从 8 位色标 (0-255) 重新缩放到 0 和 1 之间. 表格脚本“颜色单元格”然后做了两件事。 首先,它使用 a 遍历每一行对于每一行()循环和 :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;
);
运行此脚本会创建我发回给 Jim 的彩色表格。
现在,虽然这张表格非常丰富多彩,但使用这种数据确实需要一些强大的可视化。 由于 RGB 是三元坐标空间,因此三元图似乎是一个合适的起点:
A Ternary Plot is a good place to start.三元图是一个很好的起点。
行状态着色提供了每支蜡笔在 RGB 颜色空间中所处位置的清晰图片。 我还应该指出有一点买者自负关于在此应用程序中使用三元图。 严格来说,三元图平台期望为每个坐标提供的三个值的总和为 1。 当提供的数据不符合此标准时,它会将数据点标准化,使其符合标准。 因此,虽然三元图非常简洁,但它并不是 100% 准确地表示色彩空间。 然而,由于练习的目的是制作一些能激发 STEAM 兴趣的图形,我认为用一点准确性来换取视觉冲击是可以的……
从分析上讲,可以使用层次聚类根据颜色的相似程度对蜡笔进行分组。 在这里,我展示了星座图,这是我最喜欢的查看树状图的方式,来自在 RGB 空间坐标上运行 Hierarchical Clustering:
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).柔和色和日光色被放入它们自己的簇(簇 2 和 3)中。
您可以使用 k-Means 聚类脚本看到类似的结果。
后记
与往常一样,搁置一段时间后重新审视某件事会提供新的视角。 自从 Jim 最初联系以来,我已经多次访问过这个数据集。 我能说什么? 我是个书呆子,这是一个有趣的小数据集。 首先,在写这篇文章的过程中,我意识到我让这段代码比我需要的复杂得多。 整个着色操作可以使用单个对于每一行()环形。 我还可以通过创建列表和转换列表来简化编码,以获得 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.这就是当我生成一个映射出 RGB 空间中所有组合的空间填充示例时发生的情况。编者注:你读过我们工程邮袋系列的第一部分? 了解 Mike 如何帮助正在使用的用户JMP决定是否注册除雪服务。
作者的注释
对于那些再次阅读本文的人,不,你不是疯了,标题确实发生了一些变化。我收到了更新标题的请求,以便我们的搜索引擎更容易找到。我只能猜测这是因为一些搜索引擎是 19 世纪参考图书馆员的现代化身,没有幽默感。对任何不便表示歉意。-M