var gui = require('gui'); var gfx = gui.gfx; var sp = 8; // data const datapoints = [ { x: 0, v: 0 }, { x: 1, v: 100 }, { x: 2, v: -39 }, { x: 3, v: -24 }, { x: 4, v: 24 }, { x: 5, v: -12 }, { x: 6, v: 100 } ]; // create window (initial size; drawing will use current window client area) let gadgets = []; let win = gui.createWindow({ title: "Summary Chart", width: 400, height: 200, left: 30, top: 30, gadgets: gadgets }); // Compute cumulative series and min/max (include 0 to ensure Y=0 is visible) let cumulative = []; let cur = 0; cumulative.push({ x: datapoints[0].x, y: 0 }); // start at 0 let lowest = 0; let highest = 0; for (let i = 0; i < datapoints.length; ++i) { cur += datapoints[i].v; cumulative.push({ x: datapoints[i].x, y: cur }); if (cur < lowest) lowest = cur; if (cur > highest) highest = cur; } if (0 < lowest) lowest = 0; if (0 > highest) highest = 0; // Draw function using current window size function drawChart() { const totalW = Math.max(10, 400 - sp * 3); const totalH = Math.max(10, 200 - sp * 3); const left = sp; const top = sp; const right = left + totalW; const bottom = top + totalH; // X and Y ranges const minX = cumulative[0].x; const maxX = cumulative[cumulative.length - 1].x; const xRange = (maxX === minX) ? 1 : (maxX - minX); let yRange = highest - lowest; if (yRange === 0) yRange = 1; // mapping functions const mapX = x => left + ((x - minX) / xRange) * totalW; const mapY = y => bottom - ((y - lowest) / yRange) * totalH; // invert Y // draw Y=0 axis const y0 = mapY(0); gfx.setColor(win, 1); gfx.drawLine(win, left, y0, right, y0); gfx.setColor(win, 4); // draw polyline let last = cumulative[0]; for (let i = 1; i < cumulative.length; ++i) { let p = cumulative[i]; gfx.drawLine(win, mapX(last.x), mapY(last.y), mapX(p.x), mapY(p.y)); last = p; } } // initial draw drawChart(); while (true) { var evt = gui.waitEvent(win); if (!evt) continue; if (evt.type === 'close') { gui.closeWindow(win); break; } } console.log("close");