mirror of
				https://github.com/KevinMidboe/brewPi.git
				synced 2025-10-29 16:50:12 +00:00 
			
		
		
		
	Removed unsued folder
This commit is contained in:
		| @@ -1 +0,0 @@ | ||||
| export const ssr = false; | ||||
| @@ -1,85 +0,0 @@ | ||||
| <script lang="ts"> | ||||
|   import * as d3 from 'd3'; | ||||
|   import { onMount } from 'svelte'; | ||||
|   import d3_timeseries from './lib'; | ||||
|  | ||||
|   function createRandomData(n, range, rand) { | ||||
|     if (range == null) range = [0, 100]; | ||||
|     if (rand == null) rand = 1 / 20; | ||||
|  | ||||
|     var num = range[0] + Math.floor(Math.random() * (range[1] - range[0])); | ||||
|     var num2 = range[0] + Math.floor(Math.random() * (range[1] - range[0])); | ||||
|     var num3 = num; | ||||
|     var d = new Date('2013-01-01'); | ||||
|     var data = []; | ||||
|     var rgen = d3.randomNormal(0, (range[1] - range[0]) * rand); | ||||
|     for (var i = 0; i < n; i++) { | ||||
|       data.push({ | ||||
|         date: d, | ||||
|         n: num, | ||||
|         n2: num2, | ||||
|         n3: num3, | ||||
|         ci_up: num3 * 1.05, | ||||
|         ci_down: num3 * 0.95 | ||||
|       }); | ||||
|       d = new Date(d.getTime() + 1000 * 60 * 60 * 24); | ||||
|       num = num + rgen(); | ||||
|       num3 = num + rgen() / 3; | ||||
|       num = Math.min(Math.max(num, range[0]), range[1]); | ||||
|       num2 = num2 + rgen(); | ||||
|       num2 = Math.min(Math.max(num2, range[0]), range[1]); | ||||
|     } | ||||
|     return data; | ||||
|   } | ||||
|  | ||||
|   var data = createRandomData(80, [0, 1000], 0.01); | ||||
|   // [{date:new Date('2013-01-01'),n:120,n3:200},...] | ||||
|  | ||||
|   /* | ||||
|   var chart = d3_timeseries() | ||||
|     .addSerie(data, { x: 'date', y: 'n' }, { interpolate: 'monotone', color: '#333' }) | ||||
|     .width(820); | ||||
|     */ | ||||
|  | ||||
|   const svg = d3.create("svg") | ||||
|       .attr("viewBox", [0, 0, width, height]); | ||||
|  | ||||
|   const gradient = DOM.uid(); | ||||
|  | ||||
|   svg.append("g") | ||||
|       .call(xAxis); | ||||
|  | ||||
|   svg.append("g") | ||||
|       .call(yAxis); | ||||
|  | ||||
|   svg.append("linearGradient") | ||||
|       .attr("id", gradient.id) | ||||
|       .attr("gradientUnits", "userSpaceOnUse") | ||||
|       .attr("x1", 0) | ||||
|       .attr("y1", height - margin.bottom) | ||||
|       .attr("x2", 0) | ||||
|       .attr("y2", margin.top) | ||||
|     .selectAll("stop") | ||||
|       .data(d3.ticks(0, 1, 10)) | ||||
|     .join("stop") | ||||
|       .attr("offset", d => d) | ||||
|       .attr("stop-color", color.interpolator()); | ||||
|  | ||||
|   svg.append("path") | ||||
|       .datum(data) | ||||
|       .attr("fill", "none") | ||||
|       .attr("stroke", gradient) | ||||
|       .attr("stroke-width", 1.5) | ||||
|       .attr("stroke-linejoin", "round") | ||||
|       .attr("stroke-linecap", "round") | ||||
|       .attr("d", line); | ||||
|  | ||||
|   const chart = svg.node(); | ||||
|  | ||||
|   onMount(() => chart('#chart')); | ||||
| </script> | ||||
|  | ||||
| <h1>Chart goes here</h1> | ||||
| <div id="chart"></div> | ||||
|  | ||||
| <p>Hopefully above 👆</p> | ||||
| @@ -1,620 +0,0 @@ | ||||
| import * as d3 from 'd3'; | ||||
| import { transition } from 'd3-transition'; | ||||
|  | ||||
| var defaultColors = [ | ||||
|   '#a6cee3', | ||||
|   '#ff7f00', | ||||
|   '#b2df8a', | ||||
|   '#1f78b4', | ||||
|   '#fdbf6f', | ||||
|   '#33a02c', | ||||
|   '#cab2d6', | ||||
|   '#6a3d9a', | ||||
|   '#fb9a99', | ||||
|   '#e31a1c', | ||||
|   '#ffff99', | ||||
|   '#b15928' | ||||
| ]; | ||||
|  | ||||
| // utils | ||||
| function functorkey(v) { | ||||
|   return typeof v === 'function' | ||||
|     ? v | ||||
|     : function(d) { | ||||
|       return d[v]; | ||||
|     }; | ||||
| } | ||||
|  | ||||
| function functorkeyscale(v, scale) { | ||||
|   var f = | ||||
|     typeof v === 'function' | ||||
|       ? v | ||||
|       : function(d) { | ||||
|         return d[v]; | ||||
|       }; | ||||
|   return function(d) { | ||||
|     return scale(f(d)); | ||||
|   }; | ||||
| } | ||||
|  | ||||
| function keyNotNull(k) { | ||||
|   return function(d) { | ||||
|     return d.hasOwnProperty(k) && d[k] !== null && !isNaN(d[k]); | ||||
|   }; | ||||
| } | ||||
|  | ||||
| function fk(v) { | ||||
|   return function(d) { | ||||
|     return d[v]; | ||||
|   }; | ||||
| } | ||||
|  | ||||
| function main() { | ||||
|   // default | ||||
|   var height = 480; | ||||
|   var width = 600; | ||||
|  | ||||
|   var drawerHeight = 80; | ||||
|   var drawerTopMargin = 10; | ||||
|   var margin = { top: 10, bottom: 20, left: 30, right: 10 }; | ||||
|  | ||||
|   var series = []; | ||||
|  | ||||
|   var yscale = d3.scaleLinear(); | ||||
|   var xscale = d3.scaleTime(); | ||||
|   yscale.label = ''; | ||||
|   xscale.label = ''; | ||||
|  | ||||
|   var brush = d3.brushX(); | ||||
|  | ||||
|   var svg, container, serieContainer, annotationsContainer, drawerContainer, mousevline; | ||||
|   var fullxscale, tooltipDiv; | ||||
|  | ||||
|   yscale.setformat = function(n) { | ||||
|     return n.toLocaleString(); | ||||
|   }; | ||||
|   xscale.setformat = xscale.tickFormat(); | ||||
|  | ||||
|   // default tool tip function | ||||
|   var _tipFunction = function(date, series) { | ||||
|     var spans = | ||||
|       '<table style="border:none">' + | ||||
|       series | ||||
|         .filter(function(d) { | ||||
|           console.log('DDD:', d); | ||||
|           return d.item !== undefined && d.item !== null; | ||||
|         }) | ||||
|         .map(function(d) { | ||||
|           return ( | ||||
|             '<tr><td style="color:' + | ||||
|             d.options.color + | ||||
|             '">' + | ||||
|             d.options.label + | ||||
|             ' </td>' + | ||||
|             '<td style="color:#333333;text-align:right">' + | ||||
|             yscale.setformat(d.item[d.aes.y]) + | ||||
|             '</td></tr>' | ||||
|           ); | ||||
|         }) | ||||
|         .join('') + | ||||
|       '</table>'; | ||||
|  | ||||
|     return '<h4>' + xscale.setformat(d3.timeDay(date)) + '</h4>' + spans; | ||||
|   }; | ||||
|  | ||||
|   function createLines(serie) { | ||||
|     // https://github.com/d3/d3-shape/blob/master/README.md#curves | ||||
|     var aes = serie.aes; | ||||
|  | ||||
|     if (!serie.options.interpolate) { | ||||
|       serie.options.interpolate = 'linear'; | ||||
|     } else { | ||||
|       // translate curvenames | ||||
|       serie.options.interpolate = | ||||
|         serie.options.interpolate == 'monotone' | ||||
|           ? 'monotoneX' | ||||
|           : serie.options.interpolate == 'step-after' | ||||
|             ? 'stepAfter' | ||||
|             : serie.options.interpolate == 'step-before' | ||||
|               ? 'stepBefore' | ||||
|               : serie.options.interpolate; | ||||
|     } | ||||
|     // to uppercase for d3 curve name | ||||
|     var curveName = | ||||
|       'curve' + serie.options.interpolate[0].toUpperCase() + serie.options.interpolate.slice(1); | ||||
|     serie.interpolationFunction = d3[curveName] || d3.curveLinear; | ||||
|  | ||||
|     var line = d3 | ||||
|       .line() | ||||
|       .x(functorkeyscale(aes.x, xscale)) | ||||
|       .y(functorkeyscale(aes.y, yscale)) | ||||
|       .curve(serie.interpolationFunction) | ||||
|       .defined(keyNotNull(aes.y)); | ||||
|  | ||||
|     serie.line = line; | ||||
|  | ||||
|     serie.options.label = | ||||
|       serie.options.label || serie.options.name || serie.aes.label || serie.aes.y; | ||||
|  | ||||
|     if (aes.ci_up && aes.ci_down) { | ||||
|       var ciArea = d3 | ||||
|         .area() | ||||
|         .x(functorkeyscale(aes.x, xscale)) | ||||
|         .y0(functorkeyscale(aes.ci_down, yscale)) | ||||
|         .y1(functorkeyscale(aes.ci_up, yscale)) | ||||
|         .curve(serie.interpolationFunction); | ||||
|       serie.ciArea = ciArea; | ||||
|     } | ||||
|  | ||||
|     if (aes.diff) { | ||||
|       serie.diffAreas = [ | ||||
|         d3 | ||||
|           .area() | ||||
|           .x(functorkeyscale(aes.x, xscale)) | ||||
|           .y0(functorkeyscale(aes.y, yscale)) | ||||
|           .y1(function(d) { | ||||
|             if (d[aes.y] > d[aes.diff]) return yscale(d[aes.diff]); | ||||
|             return yscale(d[aes.y]); | ||||
|           }) | ||||
|           .curve(serie.interpolationFunction), | ||||
|         d3 | ||||
|           .area() | ||||
|           .x(functorkeyscale(aes.x, xscale)) | ||||
|           .y1(functorkeyscale(aes.y, yscale)) | ||||
|           .y0(function(d) { | ||||
|             if (d[aes.y] < d[aes.diff]) return yscale(d[aes.diff]); | ||||
|             return yscale(d[aes.y]); | ||||
|           }) | ||||
|           .curve(serie.interpolationFunction) | ||||
|       ]; | ||||
|     } | ||||
|  | ||||
|     serie.find = function(date) { | ||||
|       var bisect = d3.bisector(fk(aes.x)).left; | ||||
|       var i = bisect(serie.data, date) - 1; | ||||
|       if (i == -1) { | ||||
|         return null; | ||||
|       } | ||||
|  | ||||
|       // look to far after serie is defined | ||||
|       if ( | ||||
|         i == serie.data.length - 1 && | ||||
|         serie.data.length > 1 && | ||||
|         Number(date) - Number(serie.data[i][aes.x]) > | ||||
|         Number(serie.data[i][aes.x]) - Number(serie.data[i - 1][aes.x]) | ||||
|       ) { | ||||
|         return null; | ||||
|       } | ||||
|       return serie.data[i]; | ||||
|     }; | ||||
|   } | ||||
|  | ||||
|   function drawSerie(serie) { | ||||
|     if (!serie.linepath) { | ||||
|       console.log(series); | ||||
|       const sorted = [...series[0].data]; | ||||
|       sorted.sort((a, b) => (a.n > b.n ? 1 : -1)); | ||||
|       const min = sorted[0].n; | ||||
|       const max = sorted[sorted.length - 1].n; | ||||
|       console.log('max:', max); | ||||
|       console.log('min:', min); | ||||
|       const midean = (max + min) / 2; | ||||
|       console.log('midean:', midean); | ||||
|  | ||||
|       var linepath = serieContainer | ||||
|         .append('path') | ||||
|         .datum(serie.data.filter((e) => e.n <= midean)) | ||||
|         .attr('class', 'd3_timeseries line') | ||||
|         .attr('d', serie.line) | ||||
|         // .attr('stroke', serie.options.color) | ||||
|         .attr('stroke', 'red') | ||||
|         .attr('stroke-linecap', 'round') | ||||
|         .attr('stroke-width', serie.options.width || 1.5) | ||||
|         .attr('fill', 'none'); | ||||
|  | ||||
|       if (serie.options.dashed) { | ||||
|         if (serie.options.dashed == true || serie.options.dashed == 'dashed') { | ||||
|           serie['stroke-dasharray'] = '5,5'; | ||||
|         } else if (serie.options.dashed == 'long') { | ||||
|           serie['stroke-dasharray'] = '10,10'; | ||||
|         } else if (serie.options.dashed == 'dot') { | ||||
|           serie['stroke-dasharray'] = '2,4'; | ||||
|         } else { | ||||
|           serie['stroke-dasharray'] = serie.options.dashed; | ||||
|         } | ||||
|         linepath.attr('stroke-dasharray', serie['stroke-dasharray']); | ||||
|       } | ||||
|       serie.linepath = linepath; | ||||
|       // serie.hotLine = hotLine; | ||||
|  | ||||
|       if (serie.ciArea) { | ||||
|         serie.cipath = serieContainer | ||||
|           .insert('path', ':first-child') | ||||
|           .datum(serie.data) | ||||
|           .attr('class', 'd3_timeseries ci-area') | ||||
|           .attr('d', serie.ciArea) | ||||
|           .attr('stroke', 'none') | ||||
|           .attr('fill', serie.options.color) | ||||
|           .attr('opacity', serie.options.ci_opacity || 0.3); | ||||
|       } | ||||
|       if (serie.diffAreas) { | ||||
|         serie.diffpaths = serie.diffAreas.map(function(area, i) { | ||||
|           var c = (serie.options.diff_colors ? serie.options.diff_colors : ['green', 'red'])[i]; | ||||
|           return serieContainer | ||||
|             .insert('path', function() { | ||||
|               return linepath.node(); | ||||
|             }) | ||||
|             .datum(serie.data) | ||||
|             .attr('class', 'd3_timeseries diff-area') | ||||
|             .attr('d', area) | ||||
|             .attr('stroke', 'none') | ||||
|             .attr('fill', c) | ||||
|             .attr('opacity', serie.options.diff_opacity || 0.5); | ||||
|         }); | ||||
|       } | ||||
|     } else { | ||||
|       serie.linepath.attr('d', serie.line); | ||||
|       serie.linepath.attr('d', serie.hotLine); | ||||
|       if (serie.ciArea) { | ||||
|         serie.cipath.attr('d', serie.ciArea); | ||||
|       } | ||||
|       if (serie.diffAreas) { | ||||
|         serie.diffpaths[0].attr('d', serie.diffAreas[0]); | ||||
|         serie.diffpaths[1].attr('d', serie.diffAreas[1]); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   function updatefocusRing(xdate) { | ||||
|     var s = annotationsContainer.selectAll('circle.d3_timeseries.focusring'); | ||||
|  | ||||
|     if (xdate == null) { | ||||
|       s = s.data([]); | ||||
|     } else { | ||||
|       s = s.data( | ||||
|         series | ||||
|           .map(function(s) { | ||||
|             return { x: xdate, item: s.find(xdate), aes: s.aes, color: s.options.color }; | ||||
|           }) | ||||
|           .filter(function(d) { | ||||
|             return ( | ||||
|               d.item !== undefined && | ||||
|               d.item !== null && | ||||
|               d.item[d.aes.y] !== null && | ||||
|               !isNaN(d.item[d.aes.y]) | ||||
|             ); | ||||
|           }) | ||||
|       ); | ||||
|     } | ||||
|  | ||||
|     const t = transition().duration(50); | ||||
|     /* | ||||
|       .attr('cx', function(d) { | ||||
|         console.log('aDDD:', d); | ||||
|  | ||||
|         return xscale(d.item[d.aes.n]); | ||||
|       }) | ||||
|       .attr('cy', function(d) { | ||||
|         return yscale(d.item[d.aes.date]); | ||||
|       }); | ||||
|       */ | ||||
|  | ||||
|     s.transition(t); | ||||
|  | ||||
|     s.enter() | ||||
|       .append('circle') | ||||
|       .attr('class', 'd3_timeseries focusring') | ||||
|       .attr('fill', 'none') | ||||
|       .attr('stroke-width', 2) | ||||
|       .attr('r', 5) | ||||
|       .attr('stroke', fk('color')); | ||||
|  | ||||
|     s.exit().remove(); | ||||
|   } | ||||
|  | ||||
|   function updateTip(xdate) { | ||||
|     if (xdate == null) { | ||||
|       tooltipDiv.style('opacity', 0); | ||||
|     } else { | ||||
|       var s = series.map(function(s) { | ||||
|         return { item: s.find(xdate), aes: s.aes, options: s.options }; | ||||
|       }); | ||||
|  | ||||
|       tooltipDiv | ||||
|         .style('opacity', 0.9) | ||||
|         .style('left', margin.left + 5 + xscale(xdate) + 'px') | ||||
|         .style('top', '0px') | ||||
|         .html(_tipFunction(xdate, s)); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   function drawMiniDrawer() { | ||||
|     var smallyscale = yscale.copy().range([drawerHeight - drawerTopMargin, 0]); | ||||
|     var serie = series[0]; | ||||
|     var line = d3 | ||||
|       .line() | ||||
|       .x(functorkeyscale(serie.aes.x, fullxscale)) | ||||
|       .y(functorkeyscale(serie.aes.y, smallyscale)) | ||||
|       .curve(serie.interpolationFunction) | ||||
|       .defined(keyNotNull(serie.aes.y)); | ||||
|     var linepath = drawerContainer | ||||
|       .insert('path', ':first-child') | ||||
|       .datum(serie.data) | ||||
|       .attr('class', 'd3_timeseries.line') | ||||
|       .attr('transform', 'translate(0,' + drawerTopMargin + ')') | ||||
|       .attr('d', line) | ||||
|       .attr('stroke', serie.options.color) | ||||
|       .attr('stroke-width', serie.options.width || 1.5) | ||||
|       .attr('fill', 'none'); | ||||
|     if (serie.hasOwnProperty('stroke-dasharray')) { | ||||
|       linepath.attr('stroke-dasharray', serie['stroke-dasharray']); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   function mouseMove() { | ||||
|     var x = d3.pointer(container.node())[0]; | ||||
|     x = xscale.invert(x); | ||||
|     mousevline.datum({ x: x, visible: true }); | ||||
|     mousevline.update(); | ||||
|     updatefocusRing(x); | ||||
|     updateTip(x); | ||||
|   } | ||||
|   function mouseOut() { | ||||
|     mousevline.datum({ x: null, visible: false }); | ||||
|     mousevline.update(); | ||||
|     updatefocusRing(null); | ||||
|     updateTip(null); | ||||
|   } | ||||
|  | ||||
|   var chart = function(elem) { | ||||
|     // compute mins max on all series | ||||
|     series = series.map(function(s) { | ||||
|       var extent = d3.extent(s.data.map(functorkey(s.aes.y))); | ||||
|       s.min = extent[0]; | ||||
|       s.max = extent[1]; | ||||
|       extent = d3.extent(s.data.map(functorkey(s.aes.x))); | ||||
|       s.dateMin = extent[0]; | ||||
|       s.dateMax = extent[1]; | ||||
|       return s; | ||||
|     }); | ||||
|  | ||||
|     // set scales | ||||
|  | ||||
|     yscale | ||||
|       .range([height - margin.top - margin.bottom - drawerHeight - drawerTopMargin, 0]) | ||||
|       .domain([d3.min(series.map(fk('min'))), d3.max(series.map(fk('max')))]) | ||||
|       .nice(); | ||||
|  | ||||
|     xscale | ||||
|       .range([0, width - margin.left - margin.right]) | ||||
|       .domain([d3.min(series.map(fk('dateMin'))), d3.max(series.map(fk('dateMax')))]) | ||||
|       .nice(); | ||||
|  | ||||
|     // if user specify domain | ||||
|     if (yscale.fixedomain) { | ||||
|       // for showing 0 : | ||||
|       // chart.addSerie(...) | ||||
|       //    .yscale.domain([0]) | ||||
|       if (yscale.fixedomain.length == 1) { | ||||
|         yscale.fixedomain.push(yscale.domain()[1]); | ||||
|       } | ||||
|       yscale.domain(yscale.fixedomain); | ||||
|     } | ||||
|  | ||||
|     if (xscale.fixedomain) { | ||||
|       xscale.domain(yscale.fixedomain); | ||||
|     } | ||||
|  | ||||
|     fullxscale = xscale.copy(); | ||||
|  | ||||
|     // create svg | ||||
|     svg = d3.select(elem).append('svg').attr('width', width).attr('height', height); | ||||
|  | ||||
|     // clipping for scrolling in focus area | ||||
|     svg | ||||
|       .append('defs') | ||||
|       .append('clipPath') | ||||
|       .attr('id', 'clip') | ||||
|       .append('rect') | ||||
|       .attr('width', width - margin.left - margin.right) | ||||
|       .attr('height', height - margin.bottom - drawerHeight - drawerTopMargin) | ||||
|       .attr('y', -margin.top); | ||||
|  | ||||
|     // container for focus area | ||||
|     container = svg | ||||
|       .insert('g', 'rect.mouse-catch') | ||||
|       .attr('transform', 'translate(' + margin.left + ',' + margin.top + ')') | ||||
|       .attr('clip-path', 'url(#clip)'); | ||||
|  | ||||
|     serieContainer = container.append('g'); | ||||
|     annotationsContainer = container.append('g'); | ||||
|  | ||||
|     // mini container at the bottom | ||||
|     drawerContainer = svg | ||||
|       .append('g') | ||||
|       .attr( | ||||
|         'transform', | ||||
|         'translate(' + margin.left + ',' + (height - drawerHeight - margin.bottom) + ')' | ||||
|       ); | ||||
|  | ||||
|     // vertical line moving with mouse tip | ||||
|     mousevline = svg.append('g').datum({ | ||||
|       x: new Date(), | ||||
|       visible: false | ||||
|     }); | ||||
|     mousevline | ||||
|       .append('line') | ||||
|       .attr('x1', 0) | ||||
|       .attr('x2', 0) | ||||
|       .attr('y1', yscale.range()[0]) | ||||
|       .attr('y2', yscale.range()[1]) | ||||
|       .attr('class', 'd3_timeseries mousevline'); | ||||
|     // update mouse vline | ||||
|     mousevline.update = function() { | ||||
|       this.attr('transform', function(d) { | ||||
|         return 'translate(' + (margin.left + xscale(d.x)) + ',' + margin.top + ')'; | ||||
|       }).style('opacity', function(d) { | ||||
|         return d.visible ? 1 : 0; | ||||
|       }); | ||||
|     }; | ||||
|     mousevline.update(); | ||||
|  | ||||
|     var xAxis = d3.axisBottom().scale(xscale).tickFormat(xscale.setformat); | ||||
|     var yAxis = d3.axisLeft().scale(yscale).tickFormat(yscale.setformat); | ||||
|  | ||||
|     brush | ||||
|       .extent([ | ||||
|         [fullxscale.range()[0], 0], | ||||
|         [fullxscale.range()[1], drawerHeight - drawerTopMargin] | ||||
|       ]) | ||||
|  | ||||
|       .on('brush', () => { | ||||
|         let selection = d3.event.selection; | ||||
|  | ||||
|         xscale.domain(selection.map(fullxscale.invert, fullxscale)); | ||||
|  | ||||
|         series.forEach(drawSerie); | ||||
|         svg.select('.focus.x.axis').call(xAxis); | ||||
|         mousevline.update(); | ||||
|         updatefocusRing(); | ||||
|       }) | ||||
|  | ||||
|       .on('end', () => { | ||||
|         let selection = d3.event.selection; | ||||
|         if (selection === null) { | ||||
|           xscale.domain(fullxscale.domain()); | ||||
|  | ||||
|           series.forEach(drawSerie); | ||||
|           svg.select('.focus.x.axis').call(xAxis); | ||||
|           mousevline.update(); | ||||
|           updatefocusRing(); | ||||
|         } | ||||
|       }); | ||||
|  | ||||
|     svg | ||||
|       .append('g') | ||||
|       .attr('class', 'd3_timeseries focus x axis') | ||||
|       .attr( | ||||
|         'transform', | ||||
|         'translate(' + | ||||
|         margin.left + | ||||
|         ',' + | ||||
|         (height - margin.bottom - drawerHeight - drawerTopMargin) + | ||||
|         ')' | ||||
|       ) | ||||
|       .call(xAxis); | ||||
|  | ||||
|     drawerContainer | ||||
|       .append('g') | ||||
|       .attr('class', 'd3_timeseries x axis') | ||||
|       .attr('transform', 'translate(0,' + drawerHeight + ')') | ||||
|       .call(xAxis); | ||||
|  | ||||
|     drawerContainer | ||||
|       .append('g') | ||||
|       .attr('class', 'd3_timeseries brush') | ||||
|       .call(brush) | ||||
|       .attr('transform', `translate(0, ${drawerTopMargin})`) | ||||
|       .attr('height', drawerHeight - drawerTopMargin); | ||||
|  | ||||
|     svg | ||||
|       .append('g') | ||||
|       .attr('class', 'd3_timeseries y axis') | ||||
|       .attr('transform', 'translate(' + margin.left + ',' + margin.top + ')') | ||||
|       .call(yAxis) | ||||
|       .append('text') | ||||
|       .attr('transform', 'rotate(-90)') | ||||
|       .attr('x', -margin.top - d3.mean(yscale.range())) | ||||
|       .attr('dy', '.71em') | ||||
|       .attr('y', -margin.left + 5) | ||||
|       .style('text-anchor', 'middle') | ||||
|       .text(yscale.label); | ||||
|  | ||||
|     // catch event for mouse tip | ||||
|     svg | ||||
|       .append('rect') | ||||
|       .attr('width', width) | ||||
|       .attr('class', 'd3_timeseries mouse-catch') | ||||
|       .attr('height', height - drawerHeight) | ||||
|       // .style('fill','green') | ||||
|       .style('opacity', 0) | ||||
|       .on('mousemove', mouseMove) | ||||
|       .on('mouseout', mouseOut); | ||||
|  | ||||
|     tooltipDiv = d3 | ||||
|       .select(elem) | ||||
|       .style('position', 'relative') | ||||
|       .append('div') | ||||
|       .attr('class', 'd3_timeseries tooltip') | ||||
|       .style('opacity', 0); | ||||
|  | ||||
|     series.forEach(createLines); | ||||
|     series.forEach(drawSerie); | ||||
|     drawMiniDrawer(); | ||||
|   }; | ||||
|  | ||||
|   chart.width = function(_) { | ||||
|     if (!arguments.length) return width; | ||||
|     width = _; | ||||
|     return chart; | ||||
|   }; | ||||
|  | ||||
|   chart.height = function(_) { | ||||
|     if (!arguments.length) return height; | ||||
|     height = _; | ||||
|     return chart; | ||||
|   }; | ||||
|  | ||||
|   chart.margin = function(_) { | ||||
|     if (!arguments.length) return margin; | ||||
|     margin = _; | ||||
|     return chart; | ||||
|   }; | ||||
|   // accessors for margin.left(), margin.right(), margin.top(), margin.bottom() | ||||
|   // UNDEFINED | ||||
|   /* | ||||
|   d3.keys(margin).forEach(function(k) { | ||||
|     chart.margin[k] = function(_) { | ||||
|       if (!arguments.length) return margin[k]; | ||||
|       margin[k] = _; | ||||
|       return chart; | ||||
|     }; | ||||
|   }); | ||||
|   */ | ||||
|  | ||||
|   // scales accessors | ||||
|   var scaleGetSet = function(scale) { | ||||
|     return { | ||||
|       tickFormat: function(_) { | ||||
|         if (!arguments.length) return scale.setformat; | ||||
|         scale.setformat = _; | ||||
|         return chart; | ||||
|       }, | ||||
|       label: function(_) { | ||||
|         if (!arguments.length) return scale.label; | ||||
|         scale.label = _; | ||||
|         return chart; | ||||
|       }, | ||||
|       domain: function(_) { | ||||
|         if (!arguments.length && scale.fixedomain) return scale.fixedomain; | ||||
|         if (!arguments.length) return null; | ||||
|         scale.fixedomain = _; | ||||
|         return chart; | ||||
|       } | ||||
|     }; | ||||
|   }; | ||||
|  | ||||
|   chart.yscale = scaleGetSet(yscale); | ||||
|   chart.xscale = scaleGetSet(xscale); | ||||
|  | ||||
|   chart.addSerie = function(data, aes, options) { | ||||
|     if (!data && series.length > 0) data = series[0].data; | ||||
|     if (!options.color) options.color = defaultColors[series.length % defaultColors.length]; | ||||
|     series.push({ data: data, aes: aes, options: options }); | ||||
|     return chart; | ||||
|   }; | ||||
|  | ||||
|   return chart; | ||||
| } | ||||
|  | ||||
| export default main; | ||||
		Reference in New Issue
	
	Block a user