Dan*_*iel 6 colors palette tableau-api
我要找的是为子类别指定调色板.我没有在网上找到任何有关我的问题的信息.我将解释使用虚拟值:
想象一下,我有学校数据,教师,学生和看门人的名字.在数据库上,他们的名字前面是他们在学校的工作(例如:prof-John,st-Trinity,func-Manuel).目的是建立一个图表,其中包含每个人的工作年限.可以使用contains函数创建计算字段并将蓝色分配给教师,红色分配给学生,绿色分配给门卫.但是,我想区分(在图表中)每个人的工作,为教师分配蓝色而不是教师的蓝色调色板,并为学生和门卫遵循相同的意识形态.
有谁知道怎么做?提前致谢
编辑:此解决方案为您提供连续数据的调色板.如果您要为离散字段指定颜色,这显然是过度的.Alex Blakemore建议将您的连续数据离散化,这简化了这一过程.但是,如果你感觉活泼,并且想要为你的每个成员提供连续的调色板,那么这就可以了.
Tableau不允许您将整个调色板分配给维度的成员,但我为您提供了一个解决方案.一些警告:
所以...考虑自己警告.
为简单起见,我只是在数据中有两个角色,但我使用的公式将针对任意数量的角色进行推广.我还添加了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最终会很重要.我们稍后会使用该数字进行一些数学运算.由于我们只有两个角色,我们可以手动完成而不需要太多努力:
角色#
IF [Role] = 'st'
THEN 0
ELSEIF [Role] = 'prof'
THEN 1
END
Run Code Online (Sandbox Code Playgroud)如果你有更多的价值,那么你需要提出一些聪明的东西,但坦率地说,如果你有足够的价值,手动这样做将是一个挑战,那么你可能不应该给每个这些价值无论如何,自己的调色板.
现在是我为你编造的解决方案的难以辨认的,可怕的,骇人听闻的怪物.我们将制作一个自定义调色板.(你需要了解这篇文章的其余内容是如何有效的,所以如果你不知道如何制作自定义调色板,请点击该链接.不用担心,这很容易.)更具体地说,我们将构建一个单独的顺序调色板,其中包含每个角色的区域.
我们的目标是规范化和操纵我们的数据,以便学生在绿色区域,教授们在蓝色区域.让我们从规范化开始.
我们将需要每个角色的最小和最大年龄,因此我们将使用LOD表达式:
最大年龄:
{ FIXED [Role] : MAX([Age]) }
Run Code Online (Sandbox Code Playgroud)最低年龄
{ FIXED [Role] : MIN([Age]) }
Run Code Online (Sandbox Code Playgroud)现在让我们规范化年龄:
归一化年龄值(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)
当您知道死区的大小时,计算区域的大小并不难:
所以颜色区域大小的公式是:
色区大小
( ([numColorCodes] / [numColorZones]) - 1 ) / ([numColorCodes] - 1)
Run Code Online (Sandbox Code Playgroud)起点很容易从那里得出 - 它只是一个颜色区域的大小加上后续死区的大小.我们需要乘以前面计算的角色#:
色区起点
( ([numColorCodes] / [numColorZones]) * [Role #] ) / ([numColorCodes] - 1)
Run Code Online (Sandbox Code Playgroud)所以,重申一下,我们的色域将是:
颜色坐标
[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)
一帆风顺.
最简单的方法是确保您有两个离散(即蓝色)字段,通常是尺寸.说一个是专业,一个是在工作箱上多年.您可以使用create bins命令根据作业度量上的年份创建离散bin维度.您可以通过编辑bin字段来调整bin大小.
然后,如果在添加第二个字段时按住SHIFT键,则可以在颜色架上放置两个离散字段.在这种情况下,Tableau将有效地创建组合字段并智能地分配颜色.您可以通过双击颜色图例来编辑颜色分配.
这是一个例子.
| 归档时间: |
|
| 查看次数: |
592 次 |
| 最近记录: |