mirror of
https://github.com/KevinMidboe/brewPi.git
synced 2025-10-29 08:40:13 +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