这篇内容来自昨晚上一个朋友的需求,给了发了一位国外叫Boss的创作者的一个PowerBI的内容,很精彩,很有想法,今天进来复制一份。正好最近没什么灵感了,非常感谢这位朋友提供想法,也欢迎大家多提问题、多提供思路。
需求是这样的,在PowerBI的Matrix表格里面,如果要填充背景颜色,背景颜色的填充范围的取值是根据表格所有数值最大值和最小值来确认的,但如果我们想要根据每一列或者每一行的值来呈现各自的颜色就不行了,如下图↓
在这个表里面,我们最大值用绿色,最小值用红色表示,基于全表的数值。如果我们想要分每个季度来标记各个品牌的颜色范围,就不行了,但是我们可以通过新建一个度量值,自定义渐变颜色来灵活控制我们想要的结果,先看看结果↓
从上图结果可以看到,我们已经按照季度各自来做渐变背景的,看看倒数两列,数据差异很大,但是不影响最后一列853仍然是最绿的。下面来讲解一下实现方式,耐心看,略微复杂,看懂了可以根据这个规则做很多条件格式背景的创意。
那么正式开始之前,介绍一下颜色的表示方式,我找了个我的拾色器软件截图,里面还是很完整。有RGB、CMYK、HSV、HLS等等颜色表示方法,如下↓
我们今天使用的是HLSA方法,几个参数含义如下:
- H 色调,取值范围 0~360。0或360表示红色、120表示绿色、240表示蓝色。
- S 饱和度,取值范围 0%~100%。值越大,越鲜艳。
- L 亮度,取值范围 0%~100%。亮度最大时为白色,最小时为黑色。
- A 透明度,取值范围 0~1。
通过这几个参数的调整,就可以调出所有的颜色了,在PowerBI里面通过hsla()这个来求颜色值,我们来演示一下,因为是四个参数,我们新建四个可选参数,方法之前说了很多次了,就不重复了,然后根据各个值的范围,新建一个颜色的度量值,度量值DAX写法和最后自定义颜色的效果如下↓
hsla colour =
VAR hue = [色相 Value]
VAR saturation = [饱和度 Value]
VAR lightness = [亮度 Value]
VAR alpha = [透明度 Value]
RETURN
"hsla(" & hue &"," &saturation&"%,"&lightness&"%,"&alpha&")"
通过这个演示动图就可以很清晰的看出效果了,还是很灵活的,也可以根据需求做个用户自己调颜色的效果。
下面开始进入今天的主题。我们先建立一个表格,行是品牌信息、列是年份和季度,用的是Matrix表格建立的,效果如下↓
然后我们新建一个度量值,度量值的目的是得到每个数值的hsla颜色值,因为需要做行列的限制,我们需要用到表操作,需要新建一个以总金额为聚合值的中间表,需要使用ADDCOLUMNS和SUMMARIZE函数,这两个之前都介绍过,我们先建个表来看看效果,DAX语句和结果如下↓
Table =
ADDCOLUMNS(
SUMMARIZE(
'模拟销售数据',
'产品表'[品牌],
'日期表'[年份],
'日期表'[季度]
),
"总金额",[销售金额(万)]
)
就是一个按年份、季度、品牌GROUP BY金额的效果,然后我们把这个表作为一个中间表,用一个变量来表示,再加一个ALLSELECTED()函数来取消所有的筛选,再通过MAXX和MINX函数来计算出所有之中的最大值和最小值,目的是通过最大值和最小值求出数据的范围,以便计算出我们饱和度的值,因为饱和度只能在0-360之间,而我们只要红色到绿色的范围,就只需要0-120之间,我们通过简单的换算把每个数值折算到0-120,DAX语句和返回值如下↓
条件color_hue =
VAR st =
CALCULATETABLE(
ADDCOLUMNS(
SUMMARIZE(
'模拟销售数据',
'产品表'[品牌],
'日期表'[年份],
'日期表'[季度]
),
"总金额",[销售金额(万)]
),ALLSELECTED()
)
VAR max_value =
MAXX(
st,
[总金额])
VAR min_value =
MINX(
st,
[总金额])
VAR range = max_value - min_value
VAR hue =
ROUND(DIVIDE([销售金额(万)] - min_value,range)*120,2)
RETURN
hue
可以看到,我们色相值已经转换成功了,和实际金额都是一一对应的,下面就很简答了,变换一下最后的返回值,变成PowerBI能够识别的hsla模式,DAX语句和结果如下↓
条件color_hsla =
VAR st =
CALCULATETABLE(
ADDCOLUMNS(
SUMMARIZE(
'模拟销售数据',
'产品表'[品牌],
'日期表'[年份],
'日期表'[季度]
),
"总金额",[销售金额(万)]
),ALLSELECTED()
)
VAR max_value =
MAXX(
st,
[总金额])
VAR min_value =
MINX(
st,
[总金额])
VAR range = max_value - min_value
VAR hue =
ROUND(DIVIDE([销售金额(万)] - min_value,range)*120,0)
RETURN
"hsla("&hue&",90%,75%,1)"
已经是很标准了,需要说明的是,我们这里只有色相是变动值,其他几个参数我们都固定了,如果你喜欢,也可以设置成可选参数,并且色相也可以在120的基础上增加或者减少。然后我们把这个度量值设置成背景颜色就可以了,效果如下↓
这个效果适合我们直接使用背景颜色填充效果一样的,接下来就是自带的方式无法实现的按行或者列做渐变效果,我们首先按列,DAX语句和效果如下↓
条件color_hsla_brand =
VAR st =
CALCULATETABLE(
ADDCOLUMNS(
SUMMARIZE(
'模拟销售数据',
'产品表'[品牌],
'日期表'[年份],
'日期表'[季度]
),
"总金额",[销售金额(万)]
),ALLSELECTED('产品表'[品牌])
)
VAR max_value =
MAXX(
st,
[总金额])
VAR min_value =
MINX(
st,
[总金额])
VAR range = max_value - min_value
VAR hue =
ROUND(DIVIDE([销售金额(万)] - min_value,range)*120,0)
RETURN
"hsla("&hue&",90%,75%,1)"
这时我们只需要在ALLSELECTED()函数里面加上对应维度的参数就可以了,也可以取消日期的筛选,按品牌来展示,效果如下↓
到此,我们的目的已经达成了,最后我们再完善一下,把几个参数都做成可选参数,看看最后的效果吧↓
好了,结束了,周末愉快,欢迎互动 ~
,