ARTICLE DETAIL

资讯详情

深耕网站SEO优化与搜索引擎排名提升的一线实战洞察。

PowerBI实战-制作带有同比及趋势线的双柱状图

PowerBI实战-制作带有同比及趋势线的双柱状图 一、引言今天的PowerBI报表的制作相对有一点复杂我们直接根据最终展示图来讲解可以看到我们今天要制作的图像需要包括以下几点时间维度的趋势、两种不同维度的数据对比、不同数据标签的展示、不同年份间环比的标签展示以及上方趋势线以及趋势标签的制作。最终清晰展现交互性的时间趋势环比双柱状图。二、具体教学那么该如何制作这样一张表呢我们的基础数据源需要用到三列数据【日期列】图中年份数据、【双柱状图数据】图中浅蓝色为中国部分的数据橙色为Global部分数据首先我们需要用到的可视化对象接着我们需要构建在两个基础度量值分别计算当前计算到的中国部分数据总和以及Global部分数据总和Current_year_CNPVO_value sum(PVOCNI_BI[Total CHN PVO])Current_year_GlobalPVO_value sum(PVOCNI_BI[Global PVO])接着我们绘制我们的双柱状图的代码Bar_PVO // PVOCNI_BI[YEAR] ), [000 Current_year_CNPVO_value], [000 Current_year_GlobalPVO_value]VAR Width_Bar 80 //每个柱形空间宽度VAR Width_BarAct 35 //每个柱形实际宽度减小宽度以容纳两个柱子VAR GapBetweenBars 3 //两个柱子之间的间距VAR Height_ItemLabel 20 //类别标签高度VAR Height_Bar 200 //柱形最大高度VAR FontSize 14 //字号VAR SpaceAboveRect 100 //柱形上方留一定空间VAR Height_Total Height_ItemLabel Height_Bar SpaceAboveRectVAR MaxValueCN MAXX( ALLSELECTED( PVOCNI_BI[YEAR] ), [000 Current_year_CNPVO_value] )VAR MaxValueGlobal MAXX( ALLSELECTED( PVOCNI_BI[YEAR] ), [000 Current_year_GlobalPVO_value] )VAR MaxValue MAX(MaxValueCN, MaxValueGlobal) //取两个指标的最大值VAR Chart !-- CN PVO 柱子 --rectx (Width_Bar - (Width_BarAct * 2 GapBetweenBars)) / 2 y Height_Total - Height_ItemLabel - Height_Bar * [000 Current_year_CNPVO_value] / MaxValue height Height_Bar * [000 Current_year_CNPVO_value] / MaxValue width Width_BarAct filllightblue /!-- Global PVO 柱子 --rectx (Width_Bar - (Width_BarAct * 2 GapBetweenBars)) / 2 Width_BarAct GapBetweenBars y Height_Total - Height_ItemLabel - Height_Bar * [000 Current_year_GlobalPVO_value] / MaxValue height Height_Bar * [000 Current_year_GlobalPVO_value] / MaxValue width Width_BarAct fillorange /!-- 数值标签 --textx (Width_Bar - (Width_BarAct * 2 GapBetweenBars)) / 2 Width_BarAct / 2 y Height_Total - Height_ItemLabel - Height_Bar * [000 Current_year_CNPVO_value] / MaxValue - 5 text-anchormiddlefont-size FontSize * 0.7 filldeepskyblue /texttextx (Width_Bar - (Width_BarAct * 2 GapBetweenBars)) / 2 Width_BarAct * 1.5 GapBetweenBars y Height_Total - Height_ItemLabel - Height_Bar * [000 Current_year_GlobalPVO_value] / MaxValue - 5 text-anchormiddlefont-size FontSize * 0.7 fillorange /text!-- 年份标签 --textx Width_Bar / 2 y Height_Total - FontSize / 2 text-anchormiddledominant-baselinemiddlefont-size FontSize font-weightbold SELECTEDVALUE(PVOCNI_BI[YEAR]) /textRETURNsvg xmlnshttp://www.w3.org/2000/svg id SELECTEDVALUE(PVOCNI_BI[YEAR]) width Width_Bar height Height_Total Chart /svg然后是将对应数据与上面绘制的图像相结合Stylesheet // PVOCNI_BI[YEAR] ), [000 Current_year_CNPVO_value], [000 Current_year_GlobalPVO_value]VAR n COUNTROWS( ALLSELECTED( PVOCNI_BI[YEAR] ))VAR Width_Bar 80 //每个柱形空间宽度VAR Width_BarAct_CNPVO 35 //CNPVO柱形实际宽度VAR Width_BarAct_Global 21 //GlobalPVO柱形实际宽度CNPVO宽度的60%VAR Width_Total Width_Bar * nVAR Height_ItemLabel 20 //类别标签高度VAR Height_Bar 200 //柱形最大高度VAR FontSize 12 //字号VAR SpaceAboveRect 100 //柱形上方留一定空间// 分别计算CNPVO和GlobalPVO的最大值VAR MaxValue_CNPVO MAXX ( ALLSELECTED ( PVOCNI_BI[YEAR] ), [000 Current_year_CNPVO_value] )VAR MaxValue_GlobalPVO MAXX ( ALLSELECTED ( PVOCNI_BI[YEAR] ), [000 Current_year_GlobalPVO_value] )// 分别计算CNPVO和GlobalPVO的总高度VAR Height_Total_CNPVO Height_ItemLabel Height_Bar SpaceAboveRectVAR Height_Total_Global Height_ItemLabel Height_Bar SpaceAboveRect// 修正FirstValue和LastValue的计算VAR FirstValue CALCULATE([000 Current_year_CNPVO_value],TOPN(1, ALLSELECTED(PVOCNI_BI[YEAR]), PVOCNI_BI[YEAR], ASC))VAR LastValue CALCULATE([000 Current_year_CNPVO_value],TOPN(1, ALLSELECTED(PVOCNI_BI[YEAR]), PVOCNI_BI[YEAR], DESC))VAR Gap DIVIDE(LastValue-FirstValue,FirstValue)// 获取第一个和最后一个柱子的中心X坐标VAR FirstBarCenterX Width_Bar / 4 // 调整gap线的首端位置VAR LastBarCenterX Width_Total - Width_Bar*(3/4) // 调整gap线的尾端位置// 创建横向排列的柱形VAR HorizontalBars CONCATENATEX(ALLSELECTED(PVOCNI_BI[YEAR]),VAR CurrentValue [000 Current_year_CNPVO_value]VAR GlobalValue [000 Current_year_GlobalPVO_value]// 分别计算CNPVO和GlobalPVO的柱子高度VAR CNPVO_BarHeight Height_Bar * CurrentValue / MaxValue_CNPVOVAR Global_BarHeight Height_Bar * GlobalValue / MaxValue_GlobalPVO// 分别计算CNPVO和GlobalPVO的柱子Y位置VAR CNPVO_PositionY Height_Total_CNPVO - Height_ItemLabel - CNPVO_BarHeightVAR Global_PositionY Height_Total_Global - Height_ItemLabel - Global_BarHeightVAR PositionX (RANKX(ALLSELECTED(PVOCNI_BI[YEAR]), PVOCNI_BI[YEAR],,ASC) - 1) * Width_Bar// 分别计算CNPVO和GlobalPVO的X位置VAR CNPVO_PositionX PositionX (Width_Bar - Width_BarAct_CNPVO) / 2VAR Global_PositionX PositionX (Width_Bar - Width_BarAct_Global) / (1.2)VAR YearValue SELECTEDVALUE(PVOCNI_BI[YEAR])// 分别计算CNPVO和GlobalPVO柱子中心X坐标VAR CNPVO_BarCenterX CNPVO_PositionX Width_BarAct_CNPVO / 2VAR Global_BarCenterX Global_PositionX Width_BarAct_Global / 2// 计算百分比标签的X坐标VAR MonthIndex RANKX(ALLSELECTED(PVOCNI_BI[YEAR]), PVOCNI_BI[YEAR],,ASC)VAR PercentPositionX (MonthIndex - 1) * Width_Bar (Width_Bar - Width_BarAct_CNPVO) / 5.5VAR PercentBarCenterX PercentPositionX Width_BarAct_CNPVO / 4// 计算百分比标签的Y坐标并向上移动10个单位VAR PercentBarHeight Height_Bar * CurrentValue / MaxValue_CNPVO * 0.3VAR PercentPositionY Height_Total_CNPVO - Height_ItemLabel - PercentBarHeight - 45 - 10// 计算CNPVO数值标签的Y坐标位于百分比标签下方VAR CNPVO_ValueLabelY PercentPositionY 20RETURN// CNPVO柱形rect x CNPVO_PositionX y CNPVO_PositionY width Width_BarAct_CNPVO height CNPVO_BarHeight filltransparent rx2/ // GlobalPVO柱形rect x Global_PositionX y Global_PositionY width Width_BarAct_Global height Global_BarHeight filltransparent opacity0.6 rx2/ // 年份标签text x CNPVO_BarCenterX y (Height_Total_CNPVO - 5) text-anchormiddle font-size FontSize * 0.8 YearValue /text // CNPVO数值标签text x PercentBarCenterX y CNPVO_ValueLabelY text-anchormiddle font-size FontSize * 0.8 FORMAT(CurrentValue, #,##0.0) /text // GlobalPVO数值标签使用Global柱子的中心X坐标text x Global_BarCenterX y (Global_PositionY - 5) text-anchormiddle font-size FontSize * 0.7 fillblack FORMAT(GlobalValue, #,##0.0) /text)// LineBtw保持不变百分比标签的位置计算但需要向上移动10个单位VAR LineBtw ADDCOLUMNS(ALLSELECTED(PVOCNI_BI[YEAR]),line,VAR CurrentYear SELECTEDVALUE(PVOCNI_BI[YEAR])VAR PreviousYearIndex RANKX(ALLSELECTED(PVOCNI_BI[YEAR]), PVOCNI_BI[YEAR],,ASC) - 1VAR PreviousValue IF(PreviousYearIndex 1,CALCULATE([000 Current_year_CNPVO_value],WINDOW(-1,REL,-1,REL,ALLSELECTED(PVOCNI_BI[YEAR]),ORDERBY(PVOCNI_BI[YEAR]))))VAR YoY IF(ISBLANK(PreviousValue) || PreviousValue 0, BLANK(), DIVIDE([000 Current_year_CNPVO_value] - PreviousValue, PreviousValue))VAR MonthIndex RANKX(ALLSELECTED(PVOCNI_BI[YEAR]), PVOCNI_BI[YEAR],,ASC)VAR CurrentValue [000 Current_year_CNPVO_value]VAR BarHeight Height_Bar * CurrentValue / MaxValue_CNPVO * 0.3 // YoY显示在柱子上的高度VAR PositionX (MonthIndex - 1) * Width_Bar (Width_Bar - Width_BarAct_CNPVO) / 5.5VAR BarCenterX PositionX Width_BarAct_CNPVO / 4 // 柱子中心X坐标VAR PositionY Height_Total_CNPVO - Height_ItemLabel - BarHeight - 45 - 10 // 向上移动10个单位RETURNIF(NOT ISBLANK(YoY),text x BarCenterX y PositionY font-size FontSize * 0.8 text-anchormiddle fill IF(YoY0,green,red) FORMAT(YoY,▲0.0%;▼0.0%;-) /text))// 使用CNPVO的总高度作为SVG容器的高度VAR _CSS body { background-image: url(data:image/svgxml;utf8,svg xmlnshttp://www.w3.org/2000/svg width Width_Total height Height_Total_CNPVO path dM FirstBarCenterX Height_Total_CNPVO - Height_ItemLabel - Height_Bar * FirstValue / MaxValue_CNPVO L FirstBarCenterX SpaceAboveRect * 0.2 LastBarCenterX SpaceAboveRect * 0.2 LastBarCenterX Height_Total_CNPVO - Height_ItemLabel - Height_Bar * LastValue / MaxValue_CNPVO fillnone strokelightgrey stroke-width1.5 stroke-dasharray5 2/path dM Width_Total / 2 - Width_Bar SpaceAboveRect * 0.2 L Width_Total / 2 SpaceAboveRect * 0.1 Width_Total / 2 Width_Bar SpaceAboveRect * 0.2 Width_Total / 2 SpaceAboveRect * 0.3 fill IF (Gap0,green,tomato) /text x Width_Total / 2 y SpaceAboveRect * 0.25 font-size FontSize text-anchormiddle fillsnow FORMAT(Gap,0.0%;-0.0%;-) /texttext x LastBarCenterX y Height_Total_CNPVO - Height_ItemLabel - Height_Bar * LastValue / MaxValue_CNPVO - 15 font-size12 text-anchormiddle fillgrey▼/text HorizontalBars CONCATENATEX(LineBtw,[line]) /svg);background-repeat: no-repeat; } #htmlContent {display: flex;flex-wrap: nowrap;overflow-x: auto;white-space: nowrap;}RETURN IF(n1,_CSS)代码部分确实有一点复杂大家可以参照代码后面所标的注释一同理解如果大家想要套用只需修改表以及列的相关变量即可。接着我们拖入刚刚创建的第一个长度量值名称为【Bar_PVO】到Values部分Year为表格中日期维度。然后把第二个长度量值【Style Sheet】拖入到该视觉对象Format下的【Style Sheet】中接着我们就得到了所想要制作的效果。
返回列表