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

Dan*_*iel 6 colors palette tableau-api

我要找的是为子类别指定调色板.我没有在网上找到任何有关我的问题的信息.我将解释使用虚拟值:

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

有谁知道怎么做?提前致谢

And*_*ise 7

编辑:此解决方案为您提供连续数据的调色板.如果您要为离散字段指定颜色,这显然是过度的.Alex Blakemore建议将您的连续数据离散化,这简化了这一过程.但是,如果你感觉活泼,并且想要为你的每个成员提供连续的调色板,那么这就可以了.


Tableau不允许您将整个调色板分配给维度的成员,但我为您提供了一个解决方案.一些警告:

  1. Tableauing似乎总是一个又一个愚蠢的黑客攻击,但这确实是我在Tableau中做过的最骇人听闻的事情.
  2. 你将要做很多手工工作.这个过程的任何事情都不是动态的.
  3. 这个解决方案非常脆弱.如果您的数据目前只包含学生,教授和门卫,但有一天,您添加了一个冒险家,这将立即中断,您将不得不重做很多工作.

所以...考虑自己警告.


为简单起见,我只是在数据中有两个角色,但我使用的公式将针对任意数量的角色进行推广.我还添加了Age,所以我们有一个合适的方法.

+-------------+-----+
| 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  |
+-------------+-----+
Run Code Online (Sandbox Code Playgroud)

让我们从简单的部分开始吧.Tableau有一个称为split的简洁选项,用于拆分分隔符上的字段.如果你进行自定义拆分,你可以选择分隔符,但Tableau非常聪明,所以如果你只选择Split,那么它很有可能会为你解决问题.

所以右键单击[Person]并单击Transform/Split.它将为您提供两个计算字段,第一个字段如下所示:

TRIM( SPLIT( [Person], "-", 1 ) )
Run Code Online (Sandbox Code Playgroud)

应该很清楚它在做什么,同样清楚第二个字段的样子.让我们继续并将这些字段重命名为Role和Name,因此我们的表如下所示:

+-------------+------+----------+-----+
| 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  |
+-------------+------+----------+-----+
Run Code Online (Sandbox Code Playgroud)

从0开始,为每个角色添加一个序列ID最终会很重要.我们稍后会使用该数字进行一些数学运算.由于我们只有两个角色,我们可以手动完成而不需要太多努力:

  1. 角色#

    IF [Role] = 'st'
    THEN 0
    ELSEIF [Role] = 'prof'
    THEN 1
    END
    
    Run Code Online (Sandbox Code Playgroud)

如果你有更多的价值,那么你需要提出一些聪明的东西,但坦率地说,如果你有足够的价值,手动这样做将是一个挑战,那么你可能不应该给每个这些价值无论如何,自己的调色板.


现在是我为你编造的解决方案的难以辨认的,可怕的,骇人听闻的怪物.我们将制作一个自定义调色板.(你需要了解这篇文章的其余内容是如何有效的,所以如果你不知道如何制作自定义调色板,请点击该链接.不用担心,这很容易.)更具体地说,我们将构建一个单独的顺序调色板,其中包含每个角色的区域.

我们的hacktastic调色板

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

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

  1. 最大年龄:

    { FIXED [Role] : MAX([Age]) }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 最低年龄

    { FIXED [Role] : MIN([Age]) }
    
    Run Code Online (Sandbox Code Playgroud)

现在让我们规范化年龄:

  1. 归一化年龄值(NAV)

    ( ([Age] - [Minimum Age]) / ([Maximum Age] - [Minimum Age]) )
    
    Run Code Online (Sandbox Code Playgroud)

我们现在每个人的[标准化年龄值](以下称NAV)在0和1之间,在每个角色内标准化.我们的数据现在看起来像这样:

+-------------+------+--------+----------+-----+-----+-----+------+
| 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    |
+-------------+------+--------+----------+-----+-----+-----+------+
Run Code Online (Sandbox Code Playgroud)

现在我们需要将教授们转移到我们调色板的蓝色区域,这就是事情变得有点棘手的地方.

在一个只存在于我们梦想中的完美世界中,我们可以在我们的教授的NAV中加1,给我们的学生提供0到1的NAV,给我们​​的教授提供1到2的NAV,但我们的梦想没有注意到的是因为我们使用的是顺序调色板,所以调色板的每个区域之间都有"死区".

假设我们为每个颜色区域构建了一个只有两种颜色的顺序调色板.我们称它们为Green0,Green1,Blue0和Blue1.Green1和Blue0之间会有一个空格,颜色不断从绿色变为蓝色,因此在我们的调色板中无法使用此区域.我们可以通过离散化调色板来推动这一点:

盲区!

中间的绿色/蓝色部分实际上比Green1 .因此,我们需要确保我们的学生只获得Green0和Green1 之间的调色板区域,并且我们的教授只获得Blue0和Blue1 之间的调色板区域.

我们不应该在调色板上考虑Green0和Green1区域 - 它们是.这些要点将我们的调色板分为三个不同的区域:绿区,死区和蓝区.

区域

由于死区只是我们两个颜色区域之间的空间(在我们的最终绿色和我们的第一个蓝色之间),我们可以通过添加更多颜色来降低死区的大小,我认为这些颜色不一定有价值,但值得注意的是.如果我们构建一个每个区域有十种颜色的调色板,这就是区域的样子.

更多区域

现在,如果我们在调色板中添加更多颜色区域(例如,红色区域),则会添加更多死区.

现在我们只需要每个颜色区域的起点和颜色区域的大小,我们最后得到公式:

[NAV] * [Color Zone Size] + [Color Zone Starting Point]
Run Code Online (Sandbox Code Playgroud)

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

区域大小

所以颜色区域大小的公式是:

  1. 色区大小

    ( ([numColorCodes] / [numColorZones]) - 1 ) / ([numColorCodes] - 1)
    
    Run Code Online (Sandbox Code Playgroud)

起点很容易从那里得出 - 它只是一个颜色区域的大小加上后续死区的大小.我们需要乘以前面计算的角色#:

  1. 色区起点

    ( ([numColorCodes] / [numColorZones]) * [Role #] ) / ([numColorCodes] - 1)
    
    Run Code Online (Sandbox Code Playgroud)

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

  1. 颜色坐标

    [NAV] * [Color Zone Size] + [Color Zone Starting Point]
    
    Run Code Online (Sandbox Code Playgroud)

我继续把它们放在一起 - 这是一个条形图作为概念证明.

概念证明

而且,作为奖励,这是我制作的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>
Run Code Online (Sandbox Code Playgroud)

现在显然,您需要为该调色板添加另一种颜色以包括清洁工.不幸的是,这一点总是手动的,但是您可以保存一些具有不同数量区域的调色板,以便将来可以回收.您还可以让Tableau计算您需要的颜色区域数量:

{ FIXED : COUNTD([Role]) }
Run Code Online (Sandbox Code Playgroud)

一帆风顺.


Ale*_*ore 5

最简单的方法是确保您有两个离散(即蓝色)字段,通常是尺寸.说一个是专业,一个是在工作上多年.您可以使用create bins命令根据作业度量上的年份创建离散bin维度.您可以通过编辑bin字段来调整bin大小.

然后,如果在添加第二个字段时按住SHIFT键,则可以在颜色架上放置两个离散字段.在这种情况下,Tableau将有效地创建组合字段并智能地分配颜色.您可以通过双击颜色图例来编辑颜色分配.

这是一个例子.

在此输入图像描述