{#-----------------constants---------------------------#} {% set barGap = 24 %} {% set barThickness = 96 %} {% set barToValue = 6 %} {% set arrowHead = 6 %} {% set graphPadding = 48 %} {#------calculate values from template elements--------#} {% set values = elementsToValues(elements, '^tx-..-([1-9]\d*)-value$') %} {% set n = values|length %} {% set ns = namespace(cols=0, rows=1) %} {% for k, v in elements %} {% set index = regex_group('^tx-..-([1-9]\d*)-value$', k) %} {% if index != null %} {% set i = index | int %} {% set ns.rows = [i % 10, ns.rows] | max %} {% set ns.cols = [i // 10, ns.cols] | max %} {% endif %} {% endfor %} {% set nbRows = ns.rows %} {% set nbCols = ns.cols + 1 %} {% set max_ns = namespace(maxValue = 1.0, sum = 0.0) %} {% for i in range(nbCols) %} {% set max_ns.sum = 0.0 %} {% for j in range(nbRows) %} {% set index = i * 10 + j + 1 %} {% set value = valueSourceToValue(elements['tx-xx-' ~ index ~ '-value']) or 0.0 %} {% set max_ns.sum = max_ns.sum + value %} {% endfor %} {% set max_ns.maxValue = [max_ns.sum, max_ns.maxValue] | max %} {% endfor %} {% set maxValue = max_ns.maxValue %} {% set height = 240 %} {% set width = barGap + (barThickness + barGap) * nbCols %} {% set denominator = 100.0 %} {% if 1.0 >= maxValue %} {% set denominator = 1.0 %} {% endif %} {% if maxValue > 100.0 %} {% set denominator = maxValue %} {% endif %} {# bars #} {% set bar_ys = fill_array(nbCols, height) %} {% for j in range(nbRows) %} {% for i in range(nbCols) %} {% set x = barGap + (barGap + barThickness) * i %} {% set index = i * 10 + j + 1 %} {% set value = valueSourceToValue(elements['tx-xx-' ~ index ~ '-value']) or 0.0 %} {% set barHeight = height * value / denominator | round(3) %} {% set barY = bar_ys[i] - barHeight %} {{ update_array(bar_ys, i, barY) }} {% endfor %} {% endfor %} {# values #} {% set bar_ys = fill_array(nbCols, height) %} {% for j in range(nbRows) %} {% for i in range(nbCols) %} {% set x = barGap + (barGap + barThickness) * i %} {% set labelIndex = i * 10 + j + 1 %} {% set value = valueSourceToValue(elements['tx-xx-' ~ labelIndex ~ '-value']) or 0.0 %} {% set barHeight = height * value / denominator | round(3) %} {% set barY = bar_ys[i] - barHeight %} {{ update_array(bar_ys, i, barY) }} {% endfor %} {% endfor %} {# labels #} {%for i in range(nbCols) %} {% set index = i * 10 %} {% set textWidth = barGap + barThickness - 2 %} {% set x = barGap + barThickness/2 + textWidth/2 + (barGap + barThickness) * i %} {% endfor %} {# legend #} {%for j in range(nbRows) %} {% set index = j * 10 %} {% set y = (nbRows - j - 1) * 48 %} {% endfor %} {%for j in range(nbRows) %} {% set index = j * 10 %} {% set y = (nbRows - j - 1) * 48 %} {% endfor %} {# axes #} {# Test data: { "tx-xx-title": {"text": "Three-Year Revenue Forecast and Growth"}, "tx-xx-x-label": {"text": "Phase"}, "tx-xx-y-label": {"text": "Revenue (Thousand Dollars)"}, "tx-xx-1-label": {"text": "Phase One"}, "tx-xx-1-value": {"text": "150"}, "tx-xx-2-value": {"text": "300"}, "tx-xx-3-value": {"text": "100"}, "tx-xx-11-label": {"text": "Phase Two"}, "tx-xx-11-value": {"text": "400"}, "tx-xx-12-value": {"text": "320"}, "tx-xx-13-value": {"text": "130"}, "tx-xx-21-label": {"text": "Phase Three"}, "tx-xx-21-value": {"text": "200"}, "tx-xx-22-value": {"text": "400"}, "tx-xx-23-value": {"text": "600"}, "tx-xx-1-legend": {"text": "Service Sales"}, "tx-xx-2-legend": {"text": "App Purchases"}, "tx-xx-3-legend": {"text": "IP Licensing"} } #}