var selectedDataPoints = [];
var axisXMin = 0, axisXMax = 0;
var axisYMin = 0, axisYMax = 0;
var chart1 = new CanvasJS.Chart("chartContainer1", {
text: "Select the Region to Highlight dataPoints"
selectedMarkColor: "red",
dataPoints: dataGenerator(100),
var canvas = document.querySelector('#chartContainer1');
canvas.addEventListener('mousedown', handleMouseDown);
canvas.addEventListener('mouseup', handleMouseUp);
canvas.addEventListener('mousemove', handleMouseMove);
canvas.addEventListener('click', function(event) {
const timeElapsed = (+mouseUpTime) - (+mouseDownTime);
if (timeElapsed > 400) return;
const canvasPoint = convertToCanvasCoordinates({
x: event.pageX - canvas.offsetLeft,
y: event.pageY - canvas.offsetTop
const closestPoint = findClosestPoint(canvasPoint);
selectPoint(closestPoint);
function convertToCanvasCoordinates(point) {
x: chart1.axisX[0].convertPixelToValue(point.x),
y: chart1.axisY[0].convertPixelToValue(point.y)
function findClosestPoint(clickedPoint) {
let smallestDistance = 999999;
const dataPoints = chart1.options.data[0].dataPoints;
for (var i = 0; i < dataPoints.length; i++) {
const point = dataPoints[i];
const dx = clickedPoint.x - point.x;
const dy = clickedPoint.y - point.y;
const d = Math.pow(dx, 2) + Math.pow(dy, 2);
if (d < smallestDistance && d < maxDistance) {
function selectPoint(point) {
selectedDataPoints.push(point);
point.markerColor = 'red';
console.log('draw lasso');
function handleMouseDown(event) {
mouseDownTime = new Date();
x: event.clientX - canvas.offsetLeft,
y: event.clientY - canvas.offsetTop
startPoint = convertToCanvasCoordinates(clickPoint);
console.log(`startPoint = {${startPoint.x}, ${startPoint.y}}`);
function handleMouseUp(event) {
mouseUpTime = new Date();
x: event.clientX - canvas.offsetLeft,
y: event.clientY - canvas.offsetTop
endPoint = convertToCanvasCoordinates(clickPoint);
console.log(`endPoint = {${endPoint.x}, ${endPoint.y}}`);
function handleMouseMove(event) {
x: event.clientX - canvas.offsetLeft,
y: event.clientY - canvas.offsetTop
lassoPoints.push(currentPoint);
previousPoint = currentPoint;
function resetViewport(e) {
e.chart.options.axisX[0].viewportMinimum = e.chart.options.axisX[0].viewportMaximum = null;
e.chart.options.axisY[0].viewportMinimum = e.chart.options.axisY[0].viewportMaximum = null;
e.chart.options.axisX[0].viewportMinimum = axisXMin;
e.chart.options.axisX[0].viewportMaximum = axisXMax;
e.chart.options.axisY[0].viewportMinimum = axisYMin;
e.chart.options.axisY[0].viewportMaximum = axisYMax;
function dataGenerator(limit) {
for (var i = 0; i < limit; i += 1) {
y += (Math.random() * 100 - 50);
function addTable(chart){
var tableData = "<tr> <td> X-value </td> <td> Y-value </td> </tr>";
for(var j = 0; j < selectedDataPoints.length; j++){
tableData += "<tr>" + "<td>" + selectedDataPoints[j].x + "</td>";
tableData += ("<td>" + selectedDataPoints[j].y +"</td>")
$("#chartData").append(tableData);
function removeTable(chart) {
min: chart1.axisX[0].get("minimum"),
max: chart1.axisX[0].get("maximum"),
values: [ chart1.axisX[0].get("minimum"), chart1.axisX[0].get("maximum") ],
slide: function( event, ui ) {
chart1.axisX[0].set("viewportMinimum", ui.values[0], false);
chart1.axisX[0].set("viewportMaximum", ui.values[1]);
min: chart1.axisY[0].get("minimum"),
max: chart1.axisY[0].get("maximum"),
values: [ chart1.axisY[0].get("minimum"), chart1.axisY[0].get("maximum") ],
slide: function( event, ui ) {
chart1.axisY[0].set("viewportMinimum", ui.values[0], false);
chart1.axisY[0].set("viewportMaximum", ui.values[1]);
chart1.axisY[0].set("viewportMinimum", $("#ySlider").slider("values", 0), false);
chart1.axisY[0].set("viewportMaximum", $("#ySlider").slider("values", 1));
chart1.axisX[0].set("viewportMinimum", $("#xSlider").slider("values", 0), false);
chart1.axisX[0].set("viewportMaximum", $("#xSlider").slider("values", 1));