<!DOCTYPE html> <html> <head> <title>Tax forms: Bar chart with lines</title> <meta charset="UTF-8"> <script src="taxForms.js"></script> </head> <body> <canvas id="chart" width="700" height="550"></canvas> <script> const canvas = document.getElementById('chart'); const context = canvas.getContext('2d'); /* Draw a line from (fromX, fromY) to (toX, toY) */ function drawLine(fromX, fromY, toX, toY) { context.beginPath(); context.moveTo(toX, toY); context.lineTo(fromX, fromY); context.stroke(); } /* Draw a text (string) on (x, y) */ function drawText(text, x, y) { context.fillStyle = 'black'; context.fillText(text, x, y); } /* Draw a text and with a line to its right */ function drawLineWithText(text, fromX, fromY, toX, toY) { drawText(text, fromX - 50, fromY + 10); drawLine(fromX, fromY, toX, toY); } /* Insert your code here. */ /** * Draw lines on the y axis of the canvas * * @param {number} n - Number of lines to draw * @param {number} step - Number to add to y axis */ const drawNLines = (n, step) => { for (let i = 1; i <= n; i++) { const y = canvas.height * (n - i + 1 ) / (n+1); const text = step * i; drawLineWithText(text, 50, y, canvas.width - 100, y); } } /** * Draws a rectangle onto the canvas * * @param {number} x - x value of the upper left corner of the rectangle * @param {number} y - y value of the upper left corner of the rectangle * @param {number} width - Width of the rectangle * @param {number} height - Height of the rectangle (DOWNWARDS) * @param {string} color - Color of the rectangle */ const drawRectangle = (x, y, width, height, color='red') => { context.fillStyle = color; context.fillRect(x, y, width, height); } /** * Cycle a list of colors * * @generator * * @param {string[]} colors - List of colors to cycle * @yields {string} A color */ function* colorCycler(colors) { let i = 0; while (true) { yield colors[i]; i = (i + 1) % colors.length; } } /** * Draw a legend on the canvas * * @param {string[]} properties - An array of labels * @param {[string[]} colorList - An array of colors to cycle when making labels */ const drawLabels = (properties, colorList) => { const colors = colorCycler(colorList); const drawLabel = (text, color, y) => { drawText(text, canvas.width-45, y + 15) drawRectangle(canvas.width - 90, y, 40, 20, color); } const yOffset = canvas.height / 12 for (i in properties) { drawLabel(properties[i], colors.next().value, yOffset+30*i); } } drawNLines(10, 100000); const taxData = taxForms; taxData.forEach(form => delete form.realName); drawLabels(Object.getOwnPropertyNames(taxData[0]), ['red', 'blue']); </script> </body> </html>