HTML Canvas Chart Line Chart
<html> <script> function LineChart(config){ // user defined properties this.canvas = document.getElementById(config.canvasId); this.minX = config.minX; //from w ww.j a v a 2 s.c o m this.minY = config.minY; this.maxX = config.maxX; this.maxY = config.maxY; this.unitsPerTickX = config.unitsPerTickX; this.unitsPerTickY = config.unitsPerTickY; // constants this.padding = 10; this.tickSize = 10; this.axisColor = "#555"; this.pointRadius = 5; this.font = "12pt Calibri"; this.fontHeight = 12; // relationships this.context = this.canvas.getContext("2d"); this.rangeX = this.maxX - this.minY; this.rangeY = this.maxY - this.minY; this.numXTicks = Math.round(this.rangeX / this.unitsPerTickX); this.numYTicks = Math.round(this.rangeY / this.unitsPerTickY); this.x = this.getLongestValueWidth() + this.padding * 2; this.y = this.padding * 2; this.width = this.canvas.width - this.x - this.padding * 2; this.height = this.canvas.height - this.y - this.padding - this.fontHeight; this.scaleX = this.width / this.rangeX; this.scaleY = this.height / this.rangeY; // draw x y axis and tick marks this.drawXAxis(); this.drawYAxis(); } LineChart.prototype.getLongestValueWidth = function(){ this.context.font = this.font; var longestValueWidth = 0; for (var n = 0; n <= this.numYTicks; n++) { var value = this.maxY - (n * this.unitsPerTickY); longestValueWidth = Math.max(longestValueWidth, this.context.measureText(value).width); } return longestValueWidth; }; LineChart.prototype.drawXAxis = function(){ var context = this.context; context.save(); context.beginPath(); context.moveTo(this.x, this.y + this.height); context.lineTo(this.x + this.width, this.y + this.height); context.strokeStyle = this.axisColor; context.lineWidth = 2; context.stroke(); // draw tick marks for (var n = 0; n < this.numXTicks; n++) { context.beginPath(); context.moveTo((n + 1) * this.width / this.numXTicks + this.x, this.y + this.height); context.lineTo((n + 1) * this.width / this.numXTicks + this.x, this.y + this.height - this.tickSize); context.stroke(); } // draw labels context.font = this.font; context.fillStyle = "black"; context.textAlign = "center"; context.textBaseline = "middle"; for (var n = 0; n < this.numXTicks; n++) { var label = Math.round((n + 1) * this.maxX / this.numXTicks); context.save(); context.translate((n + 1) * this.width / this.numXTicks + this.x, this.y + this.height + this.padding); context.fillText(label, 0, 0); context.restore(); } context.restore(); }; LineChart.prototype.drawYAxis = function(){ var context = this.context; context.save(); context.save(); context.beginPath(); context.moveTo(this.x, this.y); context.lineTo(this.x, this.y + this.height); context.strokeStyle = this.axisColor; context.lineWidth = 2; context.stroke(); context.restore(); // draw tick marks for (var n = 0; n < this.numYTicks; n++) { context.beginPath(); context.moveTo(this.x, n * this.height / this.numYTicks + this.y); context.lineTo(this.x + this.tickSize, n * this.height /this.numYTicks + this.y); context.stroke(); } // draw values context.font = this.font; context.fillStyle = "black"; context.textAlign = "right"; context.textBaseline = "middle"; for (var n = 0; n < this.numYTicks; n++) { var value = Math.round(this.maxY - n * this.maxY / this.numYTicks); context.save(); context.translate(this.x - this.padding, n * this.height / this.numYTicks + this.y); context.fillText(value, 0, 0); context.restore(); } context.restore(); }; LineChart.prototype.drawLine = function(data, color, width){ var context = this.context; context.save(); this.transformContext(); context.lineWidth = width; context.strokeStyle = color; context.fillStyle = color; context.beginPath(); context.moveTo(data[0].x * this.scaleX, data[0].y * this.scaleY); for (var n = 0; n < data.length; n++) { var point = data[n]; // draw segment context.lineTo(point.x * this.scaleX, point.y * this.scaleY); context.stroke(); context.closePath(); context.beginPath(); context.arc(point.x * this.scaleX, point.y * this.scaleY, this.pointRadius, 0, 2 * Math.PI, false); context.fill(); context.closePath(); context.beginPath(); context.moveTo(point.x * this.scaleX, point.y * this.scaleY); } context.restore(); }; LineChart.prototype.transformContext = function(){ var context = this.context; this.context.translate(this.x, this.y + this.height); context.scale(1, -1); }; window.onload = function(){ var myLineChart = new LineChart({ canvasId: "myCanvas", minX: 0, minY: 0, maxX: 140, maxY: 100, unitsPerTickX: 10, unitsPerTickY: 10 }); var data = [{ x: 0, y: 0 }, { x: 20, y: 10 }, { x: 40, y: 75 }, { x: 60, y: 40 }, { x: 80, y: 60 }, { x: 100, y: 50 }, { x: 120, y: 85 }, { x: 140, y: 12 }]; myLineChart.drawLine(data, "blue", 3); var data = [{ x: 0, y: 5 }, { x: 10, y: 75 }, { x: 40, y: 5 }, { x: 60, y: 75 }, { x: 80, y: 45 }, { x: 100, y: 65 }, { x: 120, y: 40 }, { x: 140, y: 35 }]; myLineChart.drawLine(data, "red", 3); }; </script><!-- Math.sqr(Math.abs(x)); --> <body> <canvas id="myCanvas" width="600" height="300" style="border: 1px solid black;"> </canvas> </body> </html>