Boxplots and Dumbells

Boxplot

BoxPlot SVG _ Resolution Time = 
//Developed by Kerry Kolosko
//BoxPlot values
VAR _min = MIN('Service Desk'[Resolution Total Hours])
VAR _max = MAX('Service Desk'[Resolution Total Hours])
VAR _avg = AVERAGE('Service Desk'[Resolution Total Hours])
VAR _median = MEDIAN('Service Desk'[Resolution Total Hours])
VAR _Q1 = [IQR 1 Resolution Time (hrs)] // PERCENTILE.INC('Service Desk'[Resolution Total Hours], 0.25)
VAR _Q3 = [IQR 3 Resolution Time (hrs)] // PERCENTILE.INC('Service Desk'[Resolution Total Hours], 0.75)
VAR _IQR = _Q3 - _Q1

//BoxPlot Axis Range
VAR _minAll = CALCULATE(MIN('Service Desk'[Resolution Total Hours]), ALL('Service Desk'))
VAR _maxAll = CALCULATE(MAX('Service Desk'[Resolution Total Hours]), ALL('Service Desk'))
VAR _axisRange = _maxAll - _minAll

//Fitting BoxPlot Values to Axis
VAR _averageNode = _avg / _axisRange * 100
VAR _medianNode = _median / _axisRange * 100
VAR _maxNode = _max / _axisRange * 100
VAR _minNode = _min / _axisRange * 100
VAR _Q1Node = _Q1 / _axisRange * 100
VAR _Q3Node = _Q3 / _axisRange * 100
VAR _IQRNode = _IQR / _axisRange * 100

RETURN
"data:image/svg+xml;utf8," & "
    <svg width='100' height='20' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' overflow='visible'>
        <rect id='box' x='" & _Q1Node & "' y='4' width='" & _IQRNode & "' height='12' fill='lightsteelblue'/>
        <line x1='" & _minNode & "' y1='10' x2='" & _Q1Node & "' y2='10' stroke='black' stroke-width='2'/>
        <line x1='" & _Q3Node & "' y1='10' x2='" & _maxNode & "' y2='10' stroke='black' stroke-width='2'/>
        <rect id='minmarker' x="&"'"&_minNode&"'"&" y='1' width='2' height='20' fill='black'></rect>
        <rect id='maxmarker' x="&"'"&_maxNode&"'"&" y='1' width='2' height='20' fill='black'></rect>
        <circle cx='" & _averageNode & "' cy='10' r='3' fill='red'/>
    </svg>"

Dumbell

_Dumbell Normalised = 
VAR Category_1 = MIN(financials[Gross Sales])
VAR Category_2 = MAX(financials[Gross Sales])
VAR AXISMAXRANGE = CALCULATE(MAX(financials[Gross Sales]),ALL(financials))
VAR AXISMINRANGE = CALCULATE(MIN(financials[Gross Sales]),ALL(financials))
VAR AXISRANGE = AXISMAXRANGE-AXISMINRANGE
VAR NODE_1 = Category_1/AXISMAXRANGE*100
VAR NODE_2 = Category_2/AXISMAXRANGE*100
VAR MINNODE = MIN(NODE_1,NODE_2)
VAR MAXNODE = MAX(NODE_1,NODE_2)
VAR Result = IF(HASONEVALUE(financials[Country]),
"data:image/svg+xml;utf8," & "
    <svg width='100' height='20' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='-4 0 108 20' overflow='visible'>
        <rect id='track' x="&"'"&MINNODE&"'"&" y='9' width="&"'"&MAXNODE&"'"&" height='2' fill='black'/>
        <circle id='cat_1' cx="&"'"&NODE_1&"'"&" cy='10' r='4' width='2' height='20' fill='orange'></circle>
        <circle id='cat_2' cx="&"'"&NODE_2&"'"&" cy='10' r='4' width='2' height='20' fill='blue'></circle>
    </svg>
", BLANK())

RETURN
Result

Leave a comment

Your email address will not be published. Required fields are marked *