序言

  在上一篇博文(参考资料1)中已经完成了桑基图的制作,但还遗留了些问题。主要包括以下两个方便的内容:

  • 在画sigmoid曲线的时候,未能对各个计算字段的表计算依据设置原因进行说明。
  • 在桑基图优化部分,未能对两个柱状图重新排序的原因进行说明。

  若想解决上述两个问题,则需要了解Tableau表计算依据中的【特定维度】,关于【特定维度】的内容可以看参考资料2。
  参考资料1中画的桑基图是从3个类别流向5个产区,并且每一条sigmoid曲线是由49个点串联而成。为了能在不妨碍对上述两个问题进行阐述的前提下方便后续截图,这里要对数据进行精简。需要精简的数据包括以下几点:

  • 地区:仅保留华北、东北。这部分精简可以通过【筛选器】来实现。
  • 类别:仅保留技术、办公用品。操作同上。
  • 类型(数据桶):将数据桶的大小改为16,这样可以由49个数据点精简到4个数据点。这部分通过编辑“类型(数据桶)”,将“数据桶大小”改为16来实现。
  • 计算字段【index】: 由于类型数据桶的大小做了改变,为了保证【index】构造的数据仍能以0点为中心,需要将【index】的计算公式改为:(INDEX()-2.5)/0.5。
1.表计算依据设置

  在制作桑基图的sigmoid曲线时,定义了多个计算字段。而这些计算字段依据其具体作用可以分为三类:

  • 构造sigmoid曲线的python 绘制桑基图代码 tableau画桑基图_python 绘制桑基图代码坐标:【index】
  • 构造sigmoid曲线的python 绘制桑基图代码 tableau画桑基图_数据_02坐标:【ft】及其嵌套计算字段【rank1】、【rank2】、【sigmoid】
  • sigmoid曲线的粗细:【size】

  采用不同的先后顺序给各个计算字段设置表计算依据对最终形成的桑基图不会有影响,这里采用的顺序是先【index】、【size】再【ft】。

  为了能更清晰的展示设置表计算依据之后发生的变化,这里直接使用“分析”->“查看数据“中的数据而非工作薄中的图来展示结果。把所有的字段都拖拽到相应位置之后(具体位置看参考资料1),设置表计算依据之前,此时的数据如下:

python 绘制桑基图代码 tableau画桑基图_数据_03

1.1【index】表计算依据

python 绘制桑基图代码 tableau画桑基图_数据_04坐标。按照桑基图的定义,这里要给每一个(类别,地区)对画一条sigmoid曲线,很显然“类别”和“地区”需要作为【index】的分组依据(group by子句)。在每一组(类别,地区)中,INDEX()按“类型(数据桶)”的默认顺序(partition by子句)可以产生[1,2,3,4]的整数组,再经过(INDEX()-2.5)/0.5即可变换成[-3,-1,1,3]整数组。这个整数组即是每一个(类别,地区)对应的sigmoid曲线的python 绘制桑基图代码 tableau画桑基图_数据_04坐标。

  所以【index】的计算依据为【特定维度】下的“类型(数据桶)”。当【index】的计算依据设置完之后,数据如下:

python 绘制桑基图代码 tableau画桑基图_数据_06


注意:类型(数据桶)中缺失值已经显示出来了,但缺失数据对应的“销售额”为空。

1.2【size】表计算依据设置

  【size】的作用是将原本粗细相同的sigmoid曲线依据其对应的“销售额”占比产生粗细差别。由于【size】是作用在每一条sigmoid曲线上的,很显然“类别”和“产区”是其分组依据,所以这里其计算依据为【特定维度】下的“类型(数据桶)”。此时数据如下:

python 绘制桑基图代码 tableau画桑基图_柱状图_07


注意:从这组数据中可以发现,每一个(类别,产区)的【size】有两个不同取值。从最后的sigmoid曲线上也可以看出,每条曲线上的最后一个点较大。这是因为【size】的计算公式里使用的是RUNNING_SUM。若希望一条sigmoid曲线只对应一个【size】值的话,可以将【size】的公式更改为:TOTAL(SUM([销售额]))。

1.3【ft】计算依据设置

python 绘制桑基图代码 tableau画桑基图_柱状图_08坐标,其计算公式中嵌套了三个计算字段,具体如下:

  • 【rank1】:控制每条sigmoid曲线的起点python 绘制桑基图代码 tableau画桑基图_数据_02坐标。
  • 【rank2】:控制每条sigmoid曲线的终点python 绘制桑基图代码 tableau画桑基图_数据_02坐标。
  • 【sigmoid】:标准sigmoid曲线生成函数。这里需要给其公式中用到的【index】设置计算依据。

  【ft】中嵌套的【index】的计算依据跟前文提到的【index】计算依据相同,不再赘述。接下来主要对【rank1】和【rank2】的表计算依据设置进行说明。

  在制作桑基图的时候,【rank1】和【rank2】作为【ft】的中间结果并没有在数据中展示出来,这里为了将【rank1】和【rank2】的计算结果展示出来,打开一个新的工作薄,将与计算【rank1】、【rank2】和【ft】有关的字段拖拽到如下图所示的位置:

python 绘制桑基图代码 tableau画桑基图_python 绘制桑基图代码_11


这里依然将【index】的计算依据调整为【特定维度】下的“类型(数据桶)”。此时,数据结果如下图:

python 绘制桑基图代码 tableau画桑基图_柱状图_12


  首先【rank1】确定的是每条sigmoid曲线的起点python 绘制桑基图代码 tableau画桑基图_柱状图_08坐标。为了和左边的柱状图匹配,这就要求【rank1】至少要满足以下三个要求:1)【rank1】的取值范围在[0,1]之(其公式能满足此要求);2)每一条sigmoid曲线的起点不重合(为了满足这个要求,需要“类别”和“地区”都加入到【rank1】的表计算依据中;3)不同“类别”的【rank1】之间存在大小关系,比如所有“办公用品”的【rank1】值要大于所有“技术”的【rank1】值(为了满足这个要求,需要“类别”的排序层级高于“地区”)。

  其次【rank2】确定的是每条sigmoid曲线的终点python 绘制桑基图代码 tableau画桑基图_柱状图_08坐标。为了配合右边的柱状图,【rank2】除了要满足【rank1】的前两项要求之外,还需要保证不同“地区”的【rank2】之间存在大小关系,比如所有“东北”地区的【rank2】值必须大于所有"华北“地区的【rank2】值。所以对于【rank2】,需要“类别”和“地区”都加入到【特定维度】中,并且“地区”的排序层级要高于“类别”。

  若按上述要求将“类别”和“地区”加入到【rank1】和【rank2】表计算依据之后,此时【rank1】、【rank2】和【ft】的值如下(【ft】中的【rank1】和【rank2】也做相同的操作):

python 绘制桑基图代码 tableau画桑基图_字段_15


  此时对于“类型(数据桶)"的缺失值,其对应的【rank1】和【rank2】都是缺失的,同样,利用【rank1】和【rank2】求解的【ft】也是缺失的(上图中红框中的部分,或从图表上也可以看到所有的点都分布在两边),这显然不符合要求。所以“类型(数据桶)“也加入到【rank1】和【rank2】的计算依据中,放在最后一个层级即可。此时数据如下:

python 绘制桑基图代码 tableau画桑基图_柱状图_16


从上图框出来的部分可以发现,【rank1】在最后一个数据桶值突然增加(【rank2】-【rank1】不变),这正是sigmoid曲线重点突然发生转折的原因。

2.柱状图排序

  在桑基图美化部分对柱状图进行排序,主要是为了sigmoid曲线的起点或终点能和左右两边的柱状图匹配上。以sigmoid曲线的起点【rank1】和左柱状图为例进行说明。下面是【rank1】的计算结果:

python 绘制桑基图代码 tableau画桑基图_python 绘制桑基图代码_17


  从参考资料2中可以知道,【rank1】的计算结果与“类别”和“地区”的排序顺序有关,这两个字段的默认排序为“按 数据源顺序 升序”(上图箭头表示表示的方式)。基于这张图可以知道,数据源顺序越低,其【rank1】就越小,sigmoid曲线就靠下。但是在柱状图中,数据源顺序越低,其显示的位置就越高。如下图(图中箭头所指示的方式为“数据源顺序 升序”方向)。所以需要调整这两个柱状图的顺序。

python 绘制桑基图代码 tableau画桑基图_python 绘制桑基图代码_18