BOSS:白茶,我们最近有很多项目,能不能做个甘特图?
白茶:没问题!(应用市场上随便找个甘特图就OK了嘛!)
BOSS:对了,不要那种点进来会有点卡,等半天的那种,要保持速度!
白茶:(#¥%@!&)没问题!
日常分析时,当我们需要针对某一个连续事件进行进度更新的时候,往往会采用甘特图来进行展示,这样肉眼看起来直观,方便一眼定位到目前的项目节点。
在应用市场中,有两个应用可以帮助大家满足制作甘特图的需求:
Gantt和Gantt Chart By MAQSoftware。
除了使用应用市场的应用以外,还可以通过内置的矩阵,来实现甘特图的制作。对比市场的应用,内置的图表无论是性能上还是兼容性上都会更优一些。
案例数据:
案例数据只有两张表,一张维度表,索引使用,一张项目状态表。将数据导入到PowerBI中,模型关系如下:
白茶模拟的数据比较简单,但实际应用中,会存在项目中断重启的情况,因此为了能够在完整的维度下展示,我们需要构建一张日期表。
Dim_Data =
VAR MaxxData =
MAX (
MAXX ( ALL ( 'Fact_Status' ), [开始日期] ),
MAXX ( ALL ( 'Fact_Status' ), [结束日期] )
)
VAR MinxData =
MIN (
MINX ( ALL ( 'Fact_Status' ), [开始日期] ),
MINX ( ALL ( 'Fact_Status' ), [结束日期] )
)
VAR Result =
GENERATE (
CALENDAR ( MinxData, MaxxData ),
VAR DA = [Date]
VAR FactYear =
YEAR ( DA )
VAR FactQuarter =
"Q" & FORMAT ( DA, "Q" )
VAR FactMonth =
FORMAT ( DA, "M" )
VAR FactDAY =
DAY ( DA )
RETURN
ROW (
"年度", FactYear,
"季度", FactQuarter,
"月份索引", VALUE ( FactMonth ),
"月份", FactMonth & "月",
"日", FactDAY
)
)
RETURN
Result
模型关系更新如下:
注:新生成的日期表,不需要和原本的模型建立关系。
思考一下
接下来需要做什么?
1
2
3
获取事实表的开始日期和结束日期,再根据维度表进行条件判断即可。
编写如下DAX:
开始日期:
001.StartData =
MONTH ( SELECTEDVALUE ( 'Fact_Status'[开始日期] ) )
结束日期:
002.EndData =
MONTH ( SELECTEDVALUE ( 'Fact_Status'[结束日期] ) )
维度日期:
003.ConditionData =
SELECTEDVALUE ( 'Dim_Data'[月份索引] )
条件判断:
004.ProjectStatus =
VAR ConditionStatus =
IF (
AND (
[003.ConditionData] >= [001.StartData],
[003.ConditionData] <= [002.EndData]
),
1,
0
)
VAR Result =
IF (
AND ( HASONEFILTER ( 'Dim_Sort'[项目阶段] ), ConditionStatus = 1 ),
1,
BLANK ()
)
RETURN
Result
将度量值拉到矩阵中进行展示如下:
看起来矩阵已经有甘特图的样子了,我们继续编写如下代码:
配色:
005.FillColor =
IF ( [004.ProjectStatus] = 1, "#00B050", "#FFFFFF" )
将上述度量值,设置为矩阵值的背景和字体颜色:
再对矩阵一些细节进行调整,展示效果如下:
可以看到,已经将甘特图的样式,在矩阵中复现。除了根据日期节点进行判断以外,我们也可以加一些其他元素做判断,例如:项目的状态、当前日期节点等。
这里我们用当前日期节点判断标识一下:
006.FillColorToday =
VAR TodayMonth =
MONTH ( TODAY () )
VAR Result =
IF (
[004.ProjectStatus] = 1,
IF ( [003.ConditionData] = TodayMonth, "#FF0000", "#00B050" ),
"#FFFFFF"
)
RETURN
Result
展示效果如下:
这里是白茶,一个PowerBI的初学者。