Tableau - 根据名称使用不同的调色板

Tableau - Use different palette according to name

我正在寻找的是将调色板分配给子类别。我没有在网上找到任何关于我的问题的信息。我将使用虚拟值进行解释:

假设我有学校数据,有老师、学生和清洁工的名字。在数据库中,他们的名字前面是他们在学校的工作(例如:prof-John、st-Trinity、func-Manuel)。 目的是建立一个图表,其中包含每个人的工作年限。可以使用 contains 函数创建计算字段并将蓝色分配给教师,将红色分配给学生,将绿色分配给管理员。但是,我想区分(在图表中)工作中的每个人,而不是为教师分配蓝色,为教师分配蓝色调色板,并为学生和看门人遵循相同的想法。

有人知道怎么做吗? 提前致谢

编辑:此解决方案为您提供 连续 数据的调色板。如果您希望将颜色分配给离散字段,这显然是矫枉过正。 Alex Blakemore 关于离散化连续数据的建议大大简化了这个过程。但是,如果您感觉活泼并且想要为维度的每个成员使用连续的调色板,那么这应该可以解决问题。


Tableau 不允许您将整个调色板分配给一个维度的成员,但我为您想出了一个解决方案。一些注意事项:

  1. Tableauing 似乎总是一个又一个愚蠢的 hack,但这确实是我在 Tableau 中做过的最 hacktastic 的事情。
  2. 您将要做大量的体力劳动。这个过程甚至都不是动态的。
  3. 这个解决方案非常脆弱。如果你的数据目前只包含学生、教授和看门人,但有一天,你添加了一个冒险家,这将立即崩溃,你将不得不重做很多工作。

所以...认为自己受到警告。


为简单起见,我将在数据中包含两个角色,但我使用的公式将适用于任意数量的角色。我还添加了年龄,这样我们就有了一个衡量标准。

+-------------+-----+
| 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 最终将变得很重要。稍后我们将使用该数字进行一些数学运算。由于我们只有两个角色,我们可以手动完成而不需要太多努力:

  1. 角色#

    IF [Role] = 'st'
    THEN 0
    ELSEIF [Role] = 'prof'
    THEN 1
    END
    

如果你有比这更多的价值,那么你需要想出一些聪明的东西,但坦率地说,如果你有足够多的价值,手动执行此操作将是一个挑战,那么你可能不应该给出无论如何,这些值中的每一个都有自己的调色板。


现在,我为您制定了一个艰难、可怕、骇人听闻的怪诞解决方案。我们要制作一个 custom color palette。 (你将需要了解它是如何工作的post 的其余部分才有意义,所以如果你不知道如何制作自定义调色板,请单击那个 link。不用担心,这很简单。)更具体地说,我们将为您的每个角色构建一个带有区域的连续调色板。

我们的目标是规范化和操纵我们的数据,使学生在绿色区域,教授在蓝色区域。让我们从规范化开始。

我们将需要每个角色的最小和最大年龄,因此我们将使用 LOD 表达式:

  1. 最大年龄:

    { FIXED [Role] : MAX([Age]) }
    
  2. 最低年龄

    { FIXED [Role] : MIN([Age]) }
    

现在让我们标准化年龄:

  1. 归一化年龄值 (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]

当您知道死区的大小时,不难计算出死区的大小:

所以色域大小的公式为:

  1. 色域大小

    ( ([numColorCodes] / [numColorZones]) - 1 ) / ([numColorCodes] - 1)
    

起点很容易从那里推导出来——它只是颜色区域的大小加上后续盲区的大小。我们需要乘以我们之前计算的角色#:

  1. 色区起点

    ( ([numColorCodes] / [numColorZones]) * [Role #] ) / ([numColorCodes] - 1)
    

所以,重申一下,我们的色域将是:

  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 将有效地创建一个组合字段并智能地分配颜色。您可以通过双击颜色图例来编辑颜色分配。

这里有一个例子。