Canvas: Heatmap
Last updated
Last updated
Heatmap is a visual representation of data in the form of color gradients. The below example explains how to create a heatmap using I2Djs canvas.
let renderer = i2d.canvasLayer('#myCanvas', {}, {});
Asset 1: Circle with a gradient fill. It will be an offline canvas instance, which will be used in rendering the heat map. Every data
// Offline canvaslayer for radial gradient. Set pixelRadio to 1 and size to [100, 100]
var radialGrad = canvasAPI.canvasLayer(null,{}, {});
radialGrad.setPixelRatio(1);
radialGrad.setSize(100, 100);
var radialGradient = radialGrad.createRadialGradient({
innerCircle: { x: 50, y: 50, r: 0 },
outerCircle: { x: 50, y: 50, r: 50 },
mode: 'percent',
colorStops: [{ color: 'rgba(0, 0, 0, 0.1)', value: 0 },
{ color: 'rgba(0, 0, 0, 0)', value: 100 }]
});
// Rendering circle with radius 50 and radialGradient fill.
radialGrad.createEl({
el:'circle',
attr:{
r: 50, cx: 50, cy: 50
},
style:{
fillStyle: radialGradient
}
});
// Since its a offline canvas, it needs to be executed manually.
radialGrad.execute();
Asset 2:
/*** Offline canvaslayer for getting pixel data of linear colors.
// Set pixelRadio to 1 and size to [100, 100] ***/
var LinearGrad = canvasAPI.canvasLayer(null,{}, {});
LinearGrad.setPixelRatio(1);
LinearGrad.setSize(256, 1);
// Linear gradient.
var linearGradient = LinearGrad.createLinearGradient({
x1: 0, y1: 0, x2: 255, y2: 0,
mode: 'absolute',
colorStops: [
{ color: 'rgba(255, 255, 255, 255)', value: 0 },
{ color: 'rgba(0, 0, 122, 255)', value: 0.25 },
{ color: 'rgba(0, 200, 0, 1)', value: 0.50 },
{ color: 'rgba(200, 200, 0, 1)', value: 0.75 },
{ color: 'rgba(255, 0, 0, 1)', value: 1 }
]
});
// Rendering rect with width: 256 and linearGradient fill
LinearGrad.createEl({
el: 'rect',
attr: {
x: 0, y: 0, width: 256, height: 1
},
style: {
fillStyle: linearGradient
}
});
// Since its a offline canvas, it needs to be executed manually.
LinearGrad.execute();
let gradPallet = LinearGrad.getPixels(0, 0, 256, 1).data;
Once all our assets are ready, we draw a circular gradient canvas image for every data point to the invisible canvas.
//*** Once all our assets are ready,
/ we draw circular gradient canvas
/ image for every data point to the
/ invisible canvas. ***//
//*** after rendering image, execute
/ maually so that pixels will be
/ avaiable immediatly. ***//
renderer_.createEl({
el:'image',
attr:{
x: e.x - 50,
y: e.y - 50,
src: radialGrad
}
}).execute();
/*** fetch the pixels from the newly rendered area and color it ***/
let rawPixels = renderer_.getPixels(e.x - 50, e.y - 50, radialGrad.width, radialGrad.height);
let pixeldata = rawPixels.data;
for (let i = 3, len = pixeldata.length; i < len; i += 4) {
pixeldata[i - 1] = gradPallet[pixeldata[i] * 4 + 2];
pixeldata[i - 2] = gradPallet[pixeldata[i] * 4 + 1];
pixeldata[i - 3] = gradPallet[pixeldata[i] * 4];
}
/*** Put the pixels to the visible canvas layer ***/
renderer_2.putPixels(rawPixels, e.x - 50, e.y - 50);