The following code creates a configurable Graph class.
It draws the x and y axis with tick marks and values.
<!DOCTYPE HTML> <html> <head> <script> class Graph {/*from w ww .j a va 2 s . c o m*/ constructor(config) { this.canvas = document.getElementById(config.canvasId); this.minX = config.minX; this.minY = config.minY; this.maxX = config.maxX; this.maxY = config.maxY; this.unitsPerTick = config.unitsPerTick; this.axisColor = "#aaa"; this.font = "8pt Calibri"; this.tickSize = 20; this.context = this.canvas.getContext("2d"); this.rangeX = this.maxX - this.minX; this.rangeY = this.maxY - this.minY; this.unitX = this.canvas.width / this.rangeX; this.unitY = this.canvas.height / this.rangeY; this.centerY = Math.round(Math.abs(this.minY / this.rangeY) * this.canvas.height); this.centerX = Math.round(Math.abs(this.minX / this.rangeX) * this.canvas.width); this.iteration = (this.maxX - this.minX) / 1000; this.scaleX = this.canvas.width / this.rangeX; this.scaleY = this.canvas.height / this.rangeY; // draw x and y axis this.drawXAxis(); this.drawYAxis(); } drawXAxis() { let context = this.context; context.save(); context.beginPath(); context.moveTo(0, this.centerY); context.lineTo(this.canvas.width, this.centerY); context.strokeStyle = this.axisColor; context.lineWidth = 2; context.stroke(); // draw tick marks let xPosIncrement = this.unitsPerTick * this.unitX; let xPos, unit; context.font = this.font; context.textAlign = "center"; context.textBaseline = "top"; // draw left tick marks xPos = this.centerX - xPosIncrement; unit = -1 * this.unitsPerTick; while (xPos > 0) { context.moveTo(xPos, this.centerY - this.tickSize / 2); context.lineTo(xPos, this.centerY + this.tickSize / 2); context.stroke(); context.fillText(unit, xPos, this.centerY + this.tickSize / 2 + 3); unit -= this.unitsPerTick; xPos = Math.round(xPos - xPosIncrement); } // draw right tick marks xPos = this.centerX + xPosIncrement; unit = this.unitsPerTick; while (xPos < this.canvas.width) { context.moveTo(xPos, this.centerY - this.tickSize / 2); context.lineTo(xPos, this.centerY + this.tickSize / 2); context.stroke(); context.fillText(unit, xPos, this.centerY + this.tickSize / 2 + 3); unit += this.unitsPerTick; xPos = Math.round(xPos + xPosIncrement); } context.restore(); } drawYAxis() { let context = this.context; context.save(); context.beginPath(); context.moveTo(this.centerX, 0); context.lineTo(this.centerX, this.canvas.height); context.strokeStyle = this.axisColor; context.lineWidth = 2; context.stroke(); // draw tick marks let yPosIncrement = this.unitsPerTick * this.unitY; let yPos, unit; context.font = this.font; context.textAlign = "right"; context.textBaseline = "middle"; // draw top tick marks yPos = this.centerY - yPosIncrement; unit = this.unitsPerTick; while (yPos > 0) { context.moveTo(this.centerX - this.tickSize / 2, yPos); context.lineTo(this.centerX + this.tickSize / 2, yPos); context.stroke(); context.fillText(unit, this.centerX - this.tickSize / 2 - 3, yPos); unit += this.unitsPerTick; yPos = Math.round(yPos - yPosIncrement); } // draw bottom tick marks yPos = this.centerY + yPosIncrement; unit = -1 * this.unitsPerTick; while (yPos < this.canvas.height) { context.moveTo(this.centerX - this.tickSize / 2, yPos); context.lineTo(this.centerX + this.tickSize / 2, yPos); context.stroke(); context.fillText(unit, this.centerX - this.tickSize / 2 - 3, yPos); unit -= this.unitsPerTick; yPos = Math.round(yPos + yPosIncrement); } context.restore(); } drawEquation(equation, color, thickness) { let context = this.context; context.save(); context.save(); this.transformContext(); context.beginPath(); context.moveTo(this.minX, equation(this.minX)); for (let x = this.minX + this.iteration; x <= this.maxX; x += this.iteration) { context.lineTo(x, equation(x)); } context.restore(); context.lineJoin = "round"; context.lineWidth = thickness; context.strokeStyle = color; context.stroke(); context.restore(); } transformContext() { let context = this.context; this.context.translate(this.centerX, this.centerY); context.scale(this.scaleX, -this.scaleY); } } window.onload = function() { let myGraph = new Graph({ canvasId: "myCanvas", minX: -10, minY: -10, maxX: 10, maxY: 10, unitsPerTick: 1 }); myGraph.drawEquation(function(x) { return 5 * Math.sin(x*10); }, "green", 3); myGraph.drawEquation(function(x) { return 1 * x; }, "red", 3); myGraph.drawEquation(function(x) { return x + 10 + 5 * Math.cos(x*10); }, "red", 1); myGraph.drawEquation(function(x) { return x * x; }, "blue", 3); myGraph.drawEquation(function(x) { return Math.abs(x); }, "blue", 3); }; </script> </head> <body> <canvas id="myCanvas" width="600" height="300" style="border:1px solid black;"> </canvas> </body> </html>