Tableau - 根据名称使用不同的调色板
Tableau - Use different palette according to name
我正在寻找的是将调色板分配给子类别。我没有在网上找到任何关于我的问题的信息。我将使用虚拟值进行解释:
假设我有学校数据,有老师、学生和清洁工的名字。在数据库中,他们的名字前面是他们在学校的工作(例如:prof-John、st-Trinity、func-Manuel)。
目的是建立一个图表,其中包含每个人的工作年限。可以使用 contains 函数创建计算字段并将蓝色分配给教师,将红色分配给学生,将绿色分配给管理员。但是,我想区分(在图表中)工作中的每个人,而不是为教师分配蓝色,为教师分配蓝色调色板,并为学生和看门人遵循相同的想法。
有人知道怎么做吗?
提前致谢
编辑:此解决方案为您提供 连续 数据的调色板。如果您希望将颜色分配给离散字段,这显然是矫枉过正。 Alex Blakemore 关于离散化连续数据的建议大大简化了这个过程。但是,如果您感觉活泼并且想要为维度的每个成员使用连续的调色板,那么这应该可以解决问题。
Tableau 不允许您将整个调色板分配给一个维度的成员,但我为您想出了一个解决方案。一些注意事项:
- Tableauing 似乎总是一个又一个愚蠢的 hack,但这确实是我在 Tableau 中做过的最 hacktastic 的事情。
- 您将要做大量的体力劳动。这个过程甚至都不是动态的。
- 这个解决方案非常脆弱。如果你的数据目前只包含学生、教授和看门人,但有一天,你添加了一个冒险家,这将立即崩溃,你将不得不重做很多工作。
所以...认为自己受到警告。
为简单起见,我将在数据中包含两个角色,但我使用的公式将适用于任意数量的角色。我还添加了年龄,这样我们就有了一个衡量标准。
+-------------+-----+
| Person | Age |
+-------------+-----+
| prof-John | 53 |
| st-Trinity | 22 |
| prof-Andrew | 47 |
| st-Alice | 21 |
| st-George | 20 |
| st-Frank | 21 |
| prof-Ed | 74 |
| st-Ralph | 26 |
| st-Skrillex | 18 |
+-------------+-----+
让我们从简单的部分开始。 Tableau 有一个名为 split 的巧妙选项,可以根据分隔符拆分字段。如果您进行自定义拆分,您可以选择分隔符,但 Tableau 非常聪明,因此如果您只选择拆分,它很有可能会为您解决问题。
所以右击[人物]然后点击Transform/Split。它会给你两个计算字段,第一个看起来像这样:
TRIM( SPLIT( [Person], "-", 1 ) )
应该非常清楚它在做什么,同样清楚第二个字段的外观。让我们继续将这些字段重命名为 Role 和 Name,所以我们的 table 看起来像这样:
+-------------+------+----------+-----+
| Person | Role | Name | Age |
+-------------+------+----------+-----+
| prof-John | prof | John | 53 |
| st-Trinity | st | Trinity | 22 |
| prof-Andrew | prof | Andrew | 47 |
| st-Alice | st | Alice | 21 |
| st-George | st | George | 20 |
| st-Frank | st | Frank | 21 |
| prof-Ed | prof | Ed | 74 |
| st-Ralph | st | Ralph | 26 |
| st-Skrillex | st | Skrillex | 18 |
+-------------+------+----------+-----+
为每个角色添加一个从 0 开始的序列 ID 最终将变得很重要。稍后我们将使用该数字进行一些数学运算。由于我们只有两个角色,我们可以手动完成而不需要太多努力:
角色#
IF [Role] = 'st'
THEN 0
ELSEIF [Role] = 'prof'
THEN 1
END
如果你有比这更多的价值,那么你需要想出一些聪明的东西,但坦率地说,如果你有足够多的价值,手动执行此操作将是一个挑战,那么你可能不应该给出无论如何,这些值中的每一个都有自己的调色板。
现在,我为您制定了一个艰难、可怕、骇人听闻的怪诞解决方案。我们要制作一个 custom color palette。 (你将需要了解它是如何工作的post 的其余部分才有意义,所以如果你不知道如何制作自定义调色板,请单击那个 link。不用担心,这很简单。)更具体地说,我们将为您的每个角色构建一个带有区域的连续调色板。
我们的目标是规范化和操纵我们的数据,使学生在绿色区域,教授在蓝色区域。让我们从规范化开始。
我们将需要每个角色的最小和最大年龄,因此我们将使用 LOD 表达式:
最大年龄:
{ FIXED [Role] : MAX([Age]) }
最低年龄
{ FIXED [Role] : MIN([Age]) }
现在让我们标准化年龄:
归一化年龄值 (NAV)
( ([Age] - [Minimum Age]) / ([Maximum Age] - [Minimum Age]) )
我们现在为每个人提供了一个介于 0 和 1 之间的 [标准化年龄值](以下简称 NAV),并在每个角色中进行了标准化。我们的数据现在看起来像这样:
+-------------+------+--------+----------+-----+-----+-----+------+
| Person | Role | Role # | Name | Age | Min | Max | NAV |
+-------------+------+--------+----------+-----+-----+-----+------+
| prof-John | prof | 1 | John | 53 | 47 | 74 | .22 |
| st-Trinity | st | 0 | Trinity | 22 | 18 | 26 | .5 |
| prof-Andrew | prof | 1 | Andrew | 47 | 47 | 74 | 0 |
| st-Alice | st | 0 | Alice | 21 | 18 | 26 | .375 |
| st-George | st | 0 | George | 20 | 18 | 26 | .25 |
| st-Frank | st | 0 | Frank | 21 | 18 | 26 | .375 |
| prof-Ed | prof | 1 | Ed | 74 | 47 | 74 | 1 |
| st-Ralph | st | 0 | Ralph | 26 | 18 | 26 | 1 |
| st-Skrillex | st | 0 | Skrillex | 18 | 18 | 26 | 0 |
+-------------+------+--------+----------+-----+-----+-----+------+
现在我们需要将教授移到调色板的蓝色区域,这就是事情变得有点棘手的地方。
在一个只存在于我们梦想中的完美世界中,我们可以将教授的 NAV 加 1,让学生的 NAV 介于 0 和 1 之间,教授的 NAV 介于 1 和 2 之间,但是我们的梦想是什么没有注意到的是,因为我们使用的是顺序调色板,调色板的每个区域之间有 "dead zones"。
假设我们构建了一个顺序调色板,每个颜色区域只有两种颜色。我们称它们为 Green0、Green1、Blue0 和 Blue1。在 Green1 和 Blue0 之间会有一个 space,颜色不断从绿色变为蓝色,从而使该区域在我们的调色板中不可用。我们可以通过离散化调色板来明确这一点:
中间的 greenish/bluish 部分实际上比 Green1 轻。所以我们需要确保我们的学生只得到调色板介于 Green0和Green1之间的区域,而我们的教授只得到调色板介于[=]之间的区域148=] Blue0 和 Blue1.
我们不应该考虑调色板上的 Green0 和 Green1 区域——它们是 点 。这些点将我们的调色板分成三个不同的区域,绿区、死区和蓝区。
由于死区只是我们两个颜色区域之间的space(在我们最终的绿色和我们的第一个蓝色之间),我们可以通过添加更多颜色来减小死区的大小,这我认为不一定有价值,但值得注意。如果我们构建一个每个区域有 10 种颜色的调色板,区域就会变成这样。
现在,如果我们向调色板添加更多颜色区域(例如,红色区域),则会添加更多死区。
现在我们只需要每个颜色区域的起点和颜色区域的大小,我们得出公式:
[NAV] * [Color Zone Size] + [Color Zone Starting Point]
当您知道死区的大小时,不难计算出死区的大小:
所以色域大小的公式为:
色域大小
( ([numColorCodes] / [numColorZones]) - 1 ) / ([numColorCodes] - 1)
起点很容易从那里推导出来——它只是颜色区域的大小加上后续盲区的大小。我们需要乘以我们之前计算的角色#:
色区起点
( ([numColorCodes] / [numColorZones]) * [Role #] ) / ([numColorCodes] - 1)
所以,重申一下,我们的色域将是:
颜色坐标
[NAV] * [Color Zone Size] + [Color Zone Starting Point]
我继续将它们放在一起 — 这是一个条形图作为概念证明。
而且,作为奖励,这是我制作的 20 代码调色板。
<color-palette name="Hacktastic" type="ordered-sequential">
<color>#DBE9B1</color>
<color>#BFE38D</color>
<color>#A7DA72</color>
<color>#92D064</color>
<color>#80C45D</color>
<color>#70B557</color>
<color>#62A74D</color>
<color>#569A33</color>
<color>#498E0F</color>
<color>#398300</color>
<color>#B3D4DB</color>
<color>#8CCCE0</color>
<color>#71BFDF</color>
<color>#63ADD6</color>
<color>#4592C2</color>
<color>#2B7FB7</color>
<color>#1471B3</color>
<color>#1660A2</color>
<color>#1C508C</color>
<color>#24446F</color>
</color-palette>
现在显然,您需要向该调色板添加另一种颜色以包括看门人。不幸的是,该位始终是手动的,但是您可以保存一些具有不同数量区域的调色板,以便将来可以回收。您还可以让 Tableau 计算您需要的色区数量:
{ FIXED : COUNTD([Role]) }
祝你好运。
最简单的方法是确保您有两个 离散(即蓝色)字段,通常是维度。说一个是职业,一个是工作年限bin。您可以使用 create bins 命令根据工作度量的年份创建离散的 bin 维度。您可以通过编辑 bin 字段来调整 bin 大小。
如果在添加第二个字段时按住 SHIFT 键,则可以将两个离散字段放在颜色架上。在这种情况下,Tableau 将有效地创建一个组合字段并智能地分配颜色。您可以通过双击颜色图例来编辑颜色分配。
这里有一个例子。
我正在寻找的是将调色板分配给子类别。我没有在网上找到任何关于我的问题的信息。我将使用虚拟值进行解释:
假设我有学校数据,有老师、学生和清洁工的名字。在数据库中,他们的名字前面是他们在学校的工作(例如:prof-John、st-Trinity、func-Manuel)。 目的是建立一个图表,其中包含每个人的工作年限。可以使用 contains 函数创建计算字段并将蓝色分配给教师,将红色分配给学生,将绿色分配给管理员。但是,我想区分(在图表中)工作中的每个人,而不是为教师分配蓝色,为教师分配蓝色调色板,并为学生和看门人遵循相同的想法。
有人知道怎么做吗? 提前致谢
编辑:此解决方案为您提供 连续 数据的调色板。如果您希望将颜色分配给离散字段,这显然是矫枉过正。 Alex Blakemore 关于离散化连续数据的建议大大简化了这个过程。但是,如果您感觉活泼并且想要为维度的每个成员使用连续的调色板,那么这应该可以解决问题。
Tableau 不允许您将整个调色板分配给一个维度的成员,但我为您想出了一个解决方案。一些注意事项:
- Tableauing 似乎总是一个又一个愚蠢的 hack,但这确实是我在 Tableau 中做过的最 hacktastic 的事情。
- 您将要做大量的体力劳动。这个过程甚至都不是动态的。
- 这个解决方案非常脆弱。如果你的数据目前只包含学生、教授和看门人,但有一天,你添加了一个冒险家,这将立即崩溃,你将不得不重做很多工作。
所以...认为自己受到警告。
为简单起见,我将在数据中包含两个角色,但我使用的公式将适用于任意数量的角色。我还添加了年龄,这样我们就有了一个衡量标准。
+-------------+-----+
| Person | Age |
+-------------+-----+
| prof-John | 53 |
| st-Trinity | 22 |
| prof-Andrew | 47 |
| st-Alice | 21 |
| st-George | 20 |
| st-Frank | 21 |
| prof-Ed | 74 |
| st-Ralph | 26 |
| st-Skrillex | 18 |
+-------------+-----+
让我们从简单的部分开始。 Tableau 有一个名为 split 的巧妙选项,可以根据分隔符拆分字段。如果您进行自定义拆分,您可以选择分隔符,但 Tableau 非常聪明,因此如果您只选择拆分,它很有可能会为您解决问题。
所以右击[人物]然后点击Transform/Split。它会给你两个计算字段,第一个看起来像这样:
TRIM( SPLIT( [Person], "-", 1 ) )
应该非常清楚它在做什么,同样清楚第二个字段的外观。让我们继续将这些字段重命名为 Role 和 Name,所以我们的 table 看起来像这样:
+-------------+------+----------+-----+
| Person | Role | Name | Age |
+-------------+------+----------+-----+
| prof-John | prof | John | 53 |
| st-Trinity | st | Trinity | 22 |
| prof-Andrew | prof | Andrew | 47 |
| st-Alice | st | Alice | 21 |
| st-George | st | George | 20 |
| st-Frank | st | Frank | 21 |
| prof-Ed | prof | Ed | 74 |
| st-Ralph | st | Ralph | 26 |
| st-Skrillex | st | Skrillex | 18 |
+-------------+------+----------+-----+
为每个角色添加一个从 0 开始的序列 ID 最终将变得很重要。稍后我们将使用该数字进行一些数学运算。由于我们只有两个角色,我们可以手动完成而不需要太多努力:
角色#
IF [Role] = 'st' THEN 0 ELSEIF [Role] = 'prof' THEN 1 END
如果你有比这更多的价值,那么你需要想出一些聪明的东西,但坦率地说,如果你有足够多的价值,手动执行此操作将是一个挑战,那么你可能不应该给出无论如何,这些值中的每一个都有自己的调色板。
现在,我为您制定了一个艰难、可怕、骇人听闻的怪诞解决方案。我们要制作一个 custom color palette。 (你将需要了解它是如何工作的post 的其余部分才有意义,所以如果你不知道如何制作自定义调色板,请单击那个 link。不用担心,这很简单。)更具体地说,我们将为您的每个角色构建一个带有区域的连续调色板。
我们的目标是规范化和操纵我们的数据,使学生在绿色区域,教授在蓝色区域。让我们从规范化开始。
我们将需要每个角色的最小和最大年龄,因此我们将使用 LOD 表达式:
最大年龄:
{ FIXED [Role] : MAX([Age]) }
最低年龄
{ FIXED [Role] : MIN([Age]) }
现在让我们标准化年龄:
归一化年龄值 (NAV)
( ([Age] - [Minimum Age]) / ([Maximum Age] - [Minimum Age]) )
我们现在为每个人提供了一个介于 0 和 1 之间的 [标准化年龄值](以下简称 NAV),并在每个角色中进行了标准化。我们的数据现在看起来像这样:
+-------------+------+--------+----------+-----+-----+-----+------+
| Person | Role | Role # | Name | Age | Min | Max | NAV |
+-------------+------+--------+----------+-----+-----+-----+------+
| prof-John | prof | 1 | John | 53 | 47 | 74 | .22 |
| st-Trinity | st | 0 | Trinity | 22 | 18 | 26 | .5 |
| prof-Andrew | prof | 1 | Andrew | 47 | 47 | 74 | 0 |
| st-Alice | st | 0 | Alice | 21 | 18 | 26 | .375 |
| st-George | st | 0 | George | 20 | 18 | 26 | .25 |
| st-Frank | st | 0 | Frank | 21 | 18 | 26 | .375 |
| prof-Ed | prof | 1 | Ed | 74 | 47 | 74 | 1 |
| st-Ralph | st | 0 | Ralph | 26 | 18 | 26 | 1 |
| st-Skrillex | st | 0 | Skrillex | 18 | 18 | 26 | 0 |
+-------------+------+--------+----------+-----+-----+-----+------+
现在我们需要将教授移到调色板的蓝色区域,这就是事情变得有点棘手的地方。
在一个只存在于我们梦想中的完美世界中,我们可以将教授的 NAV 加 1,让学生的 NAV 介于 0 和 1 之间,教授的 NAV 介于 1 和 2 之间,但是我们的梦想是什么没有注意到的是,因为我们使用的是顺序调色板,调色板的每个区域之间有 "dead zones"。
假设我们构建了一个顺序调色板,每个颜色区域只有两种颜色。我们称它们为 Green0、Green1、Blue0 和 Blue1。在 Green1 和 Blue0 之间会有一个 space,颜色不断从绿色变为蓝色,从而使该区域在我们的调色板中不可用。我们可以通过离散化调色板来明确这一点:
中间的 greenish/bluish 部分实际上比 Green1 轻。所以我们需要确保我们的学生只得到调色板介于 Green0和Green1之间的区域,而我们的教授只得到调色板介于[=]之间的区域148=] Blue0 和 Blue1.
我们不应该考虑调色板上的 Green0 和 Green1 区域——它们是 点 。这些点将我们的调色板分成三个不同的区域,绿区、死区和蓝区。
由于死区只是我们两个颜色区域之间的space(在我们最终的绿色和我们的第一个蓝色之间),我们可以通过添加更多颜色来减小死区的大小,这我认为不一定有价值,但值得注意。如果我们构建一个每个区域有 10 种颜色的调色板,区域就会变成这样。
现在,如果我们向调色板添加更多颜色区域(例如,红色区域),则会添加更多死区。
现在我们只需要每个颜色区域的起点和颜色区域的大小,我们得出公式:
[NAV] * [Color Zone Size] + [Color Zone Starting Point]
当您知道死区的大小时,不难计算出死区的大小:
所以色域大小的公式为:
色域大小
( ([numColorCodes] / [numColorZones]) - 1 ) / ([numColorCodes] - 1)
起点很容易从那里推导出来——它只是颜色区域的大小加上后续盲区的大小。我们需要乘以我们之前计算的角色#:
色区起点
( ([numColorCodes] / [numColorZones]) * [Role #] ) / ([numColorCodes] - 1)
所以,重申一下,我们的色域将是:
颜色坐标
[NAV] * [Color Zone Size] + [Color Zone Starting Point]
我继续将它们放在一起 — 这是一个条形图作为概念证明。
而且,作为奖励,这是我制作的 20 代码调色板。
<color-palette name="Hacktastic" type="ordered-sequential">
<color>#DBE9B1</color>
<color>#BFE38D</color>
<color>#A7DA72</color>
<color>#92D064</color>
<color>#80C45D</color>
<color>#70B557</color>
<color>#62A74D</color>
<color>#569A33</color>
<color>#498E0F</color>
<color>#398300</color>
<color>#B3D4DB</color>
<color>#8CCCE0</color>
<color>#71BFDF</color>
<color>#63ADD6</color>
<color>#4592C2</color>
<color>#2B7FB7</color>
<color>#1471B3</color>
<color>#1660A2</color>
<color>#1C508C</color>
<color>#24446F</color>
</color-palette>
现在显然,您需要向该调色板添加另一种颜色以包括看门人。不幸的是,该位始终是手动的,但是您可以保存一些具有不同数量区域的调色板,以便将来可以回收。您还可以让 Tableau 计算您需要的色区数量:
{ FIXED : COUNTD([Role]) }
祝你好运。
最简单的方法是确保您有两个 离散(即蓝色)字段,通常是维度。说一个是职业,一个是工作年限bin。您可以使用 create bins 命令根据工作度量的年份创建离散的 bin 维度。您可以通过编辑 bin 字段来调整 bin 大小。
如果在添加第二个字段时按住 SHIFT 键,则可以将两个离散字段放在颜色架上。在这种情况下,Tableau 将有效地创建一个组合字段并智能地分配颜色。您可以通过双击颜色图例来编辑颜色分配。
这里有一个例子。