Snippets

Piotr Szrajber Smart M.App - adaptive binning for line charts

Created by Piotr Szrajber last modified
/**
* Turn on adaptive binning for line charts.
* 2017-07-26 Piotr Szrajber <piotr.szrajber@hexagongeospatial.com>
*/

let N_BINS = 50; // best results 20..100

function findMinMax(data, property) {
    return data.reduce((acc, c) => ({
        min: Math.min(acc.min, c[property]),
        max: Math.max(acc.max, c[property])
    }), {
        min: Infinity,
        max: -Infinity
    });
}

function turnOnAdaptiveBinning(widget) {
    gsp.bi.stage.requireLibraries(function(gvc) {
        var property = widget.chartM.key[0], // dimension
            stage = widget.chart.dataStage(), // get reference to the dataStage
            minMax = findMinMax(stage.rows(), property), // compute min & max
            range = minMax.max - minMax.min,
            customDimension = stage.facts().dimension(function(d) {
                let value = d[property];
                return value - value % (range / N_BINS); // provided by Dave Oke <david.oke at hexagongeospatial.com>
            }),
            customGroup = gvc.dataReducers({}).reduceGrouping(customDimension.group(), stage.stageModel().values, "whatever");
        widget.chart.dimension(customDimension);
        widget.chart.group(customGroup);
        //widget.chart.xAxis().scale().domain([0,50]); // modify the x domain
        widget.chart.redraw();
    });
}

function modifyLineCharts(callback, errback) {
    // find all line charts
    gsp.bi.stage.findWidgets({
        descriptors: [{
            chartM: {
                chart: "line"
            }
        }]
    }, function(widgets) {
        widgets.forEach(turnOnAdaptiveBinning);
        if (typeof callback === "function") callback(widgets);
    }, errback)
}

modifyLineCharts(() => console.log("hooray!"), () => console.error("something went wrong!"));

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.