/** Points **/ Flotr.addType('points', { options: { show: false, // => setting to true will show points, false will hide radius: 3, // => point radius (pixels) lineWidth: 2, // => line width in pixels fill: true, // => true to fill the points with a color, false for (transparent) no fill fillColor: '#FFFFFF', // => fill color. Null to use series color. fillOpacity: 1, // => opacity of color inside the points hitRadius: null // => override for points hit radius }, draw : function (options) { var context = options.context, lineWidth = options.lineWidth, shadowSize = options.shadowSize; context.save(); if (shadowSize > 0) { context.lineWidth = shadowSize / 2; context.strokeStyle = 'rgba(0,0,0,0.1)'; this.plot(options, shadowSize / 2 + context.lineWidth / 2); context.strokeStyle = 'rgba(0,0,0,0.2)'; this.plot(options, context.lineWidth / 2); } context.lineWidth = options.lineWidth; context.strokeStyle = options.color; if (options.fill) context.fillStyle = options.fillStyle; this.plot(options); context.restore(); }, plot : function (options, offset) { var data = options.data, context = options.context, xScale = options.xScale, yScale = options.yScale, i, x, y; for (i = data.length - 1; i > -1; --i) { y = data[i][1]; if (y === null) continue; x = xScale(data[i][0]); y = yScale(y); if (x < 0 || x > options.width || y < 0 || y > options.height) continue; context.beginPath(); if (offset) { context.arc(x, y + offset, options.radius, 0, Math.PI, false); } else { context.arc(x, y, options.radius, 0, 2 * Math.PI, true); if (options.fill) context.fill(); } context.stroke(); context.closePath(); } } });