Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...


Paste code macro
languagegroovy
titleVariwide Chart with DM Query
//======================================================
// to be adapted to your partition's Datamart definition
def DM_NAME = 'datamart_transaction'
def SKU_FIELD = 'ProductID'
def IP_FIELD = 'InvoicePrice'
def COSTS_FIELD = 'Costs'
def YEAR_FIELD = 'InvoiceDateYear'
//======================================================

def ctx = api.getDatamartContext()
def dm = ctx.getDatamart(DM_NAME)
def customQuery =
  ctx.newQuery(dm, true)
    .select(SKU_FIELD, 'Sku')
    .select('SUM('+IP_FIELD+')/1e6', 'Revenue')
    .select('SUM('+IP_FIELD+'-'+COSTS_FIELD+')/SUM('+IP_FIELD+')', 'MarginPct')
//  .where(YEAR_FIELD + '=2014')
    .orderBy(SKU_FIELD)

api.trace('customQuery', null, customQuery)

def res = ctx.executeQuery(customQuery)
def data = []

res?.getData()?.each  { row ->
  data.push([row.get('Sku'), row.get('MarginPct'), row.get('Revenue')])
}

def definition = [
  chart: [
        type: 'variwide'
    ],

    title: [
        text: 'Margin % by Product'
    ],

    xAxis: [
        type: 'category',
        title: [
            text: 'Column widths are proportional to total revenue'
        ]
    ],

    legend: [
        enabled: false
    ],

    series: [[
        name: 'Margin',
        data: data,
        dataLabels: [
            enabled: true,
            format: '{point.y:.2f} %'
        ],
        tooltip: [
            pointFormat: 'Margin: <b>{point.y:.2f} %</b><br>' +
                'GDP: <b>€ {point.z:.1f} K</b><br>'
        ],
        colorByPoint: true
    ]]
]

def chart = api.buildHighchart(definition)
chart.addModule('variwide')

return chart

Tips

  • If you cannot find an example of an existing logic that uses a chart type that you intend to use, it should be fairly easy to adapt one of the Highcharts Demos. Select your chart and click on the 'View Options' button and you will see the JS source code, including a Highcharts.chart('container', {...}) call. This {...} content is the definition map. You will have to convert it from JS to Groovy. This always implies replacing the curly brackets by square brackets ({} -> []). But you may also sometimes encounter code like Highcharts.color(colors[5]).brighten(0.2).get() which you should replace by your own hard coded colors, or formatter: function () {...} which you would have to replace by a simpler pattern formatter format: '{point.name}: {point.y:.1f}%'.

  • If you want to remove the “Highcharts.com” watermark and link from the chart, use the credits property in your definition:

    Code Block
    def chartDef = [
    	chart: [ type: 'column' ],
    		credits: [
    				enabled: false
    			],
    
    		title: [
    			text: 'My Chart'
    		],



Info

See also: