diff --git a/.gitignore b/.gitignore index 1025e17b..18171fc9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ node_modules/ .expo/ +.DS_Store npm-debug.* +package-lock.json diff --git a/data.js b/data.js index e23f93f2..52f92363 100644 --- a/data.js +++ b/data.js @@ -11,6 +11,24 @@ const data = { 71, 100 ] + },{ + data: [ + 20, + 10, + 4, + 56, + 87, + 90 + ] + },{ + data: [ + 30, + 90, + 67, + 54, + 10, + 2 + ] }] } diff --git a/src/line-chart.js b/src/line-chart.js index b9263e26..675dec65 100644 --- a/src/line-chart.js +++ b/src/line-chart.js @@ -15,16 +15,24 @@ class LineChart extends AbstractChart { renderDots = config => { const { data, width, height, paddingTop, paddingRight } = config - return data.map((x, i) => { - return ( - ) + let output = []; + data.map((dataset,index)=>{ + dataset.data.map((x, i) => { + output.push ( + ) + }) }) + return ( + output + ) + + } renderShadow = config => { @@ -32,16 +40,25 @@ class LineChart extends AbstractChart { return this.renderBezierShadow(config) } const { data, width, height, paddingRight, paddingTop } = config + let output = []; + config.data.map((dataset,index)=>{ + output.push ( + + (paddingRight + (i * (width - paddingRight) / dataset.data.length)) + + ',' + + (((height / 4 * 3 * (1 - ((x - Math.min(...dataset.data)) / this.calcScaler(dataset.data)))) + paddingTop)) + ).join(' ') + ` ${paddingRight + ((width - paddingRight) / dataset.data.length * (dataset.data.length - 1))},${(height / 4 * 3) + paddingTop} ${paddingRight},${(height / 4 * 3) + paddingTop}`} + fill="url(#fillShadowGradient)" + strokeWidth={0} + />) + }) return ( - - (paddingRight + (i * (width - paddingRight) / data.length)) + - ',' + - (((height / 4 * 3 * (1 - ((x - Math.min(...data)) / this.calcScaler(data)))) + paddingTop)) - ).join(' ') + ` ${paddingRight + ((width - paddingRight) / data.length * (data.length - 1))},${(height / 4 * 3) + paddingTop} ${paddingRight},${(height / 4 * 3) + paddingTop}`} - fill="url(#fillShadowGradient)" - strokeWidth={0} - />) + output + ) + + } renderLine = config => { @@ -49,29 +66,44 @@ class LineChart extends AbstractChart { return this.renderBezierLine(config) } const { width, height, paddingRight, paddingTop, data } = config - const points = data.map((x, i) => - (paddingRight + (i * (width - paddingRight) / data.length)) + + let output = []; + data.map((dataset,index) => { + + const points = dataset.data.map((x, i) => + (paddingRight + (i * (width - paddingRight) / dataset.data.length)) + ',' + - (((height / 4 * 3 * (1 - ((x - Math.min(...data)) / this.calcScaler(data))))) + paddingTop)) + (((height / 4 * 3 * (1 - ((x - Math.min(...dataset.data)) / this.calcScaler(dataset.data))))) + paddingTop)) + + output.push ( + + ) + + }) return ( - + output ) + + } - getBezierLinePoints = config => { + getBezierLinePoints = (dataset, config) => { + const { width, height, paddingRight, paddingTop, data } = config - if (data.length === 0) { + let output = []; + if (dataset.data.length === 0) { return 'M0,0' } - const x = i => Math.floor(paddingRight + i * (width - paddingRight) / data.length) - const y = i => Math.floor(((height / 4 * 3 * (1 - ((data[i] - Math.min(...data)) / this.calcScaler(data)))) + paddingTop)) - return [`M${x(0)},${y(0)}`].concat(data.slice(0, -1).map((_, i) => { + const x = i => Math.floor(paddingRight + i * (width - paddingRight) / dataset.data.length) + const y = i => Math.floor(((height / 4 * 3 * (1 - ((dataset.data[i] - Math.min(...dataset.data)) / this.calcScaler(dataset.data)))) + paddingTop)) + + return [`M${x(0)},${y(0)}`].concat(dataset.data.slice(0, -1).map((_, i) => { const x_mid = (x(i) + x(i + 1)) / 2 const y_mid = (y(i) + y(i + 1)) / 2 const cp_x1 = (x_mid + x(i)) / 2 @@ -79,28 +111,49 @@ class LineChart extends AbstractChart { return `Q ${cp_x1}, ${y(i)}, ${x_mid}, ${y_mid}` + ` Q ${cp_x2}, ${y(i + 1)}, ${x(i + 1)}, ${y(i + 1)}` })).join(' ') + + } renderBezierLine = config => { + let output = []; + config.data.map((dataset,index)=>{ + let result = this.getBezierLinePoints(dataset,config); + output.push ( + + ) + }); return ( - + output ) + + } renderBezierShadow = config => { const { width, height, paddingRight, paddingTop, data } = config + let output = []; + data.map((dataset,index)=>{ + let d = this.getBezierLinePoints(dataset,config) + + ` L${paddingRight + ((width - paddingRight) / dataset.data.length * (dataset.data.length - 1))},${(height / 4 * 3) + paddingTop} L${paddingRight},${(height / 4 * 3) + paddingTop} Z` + output.push ( + ) + }) return ( - ) + output + ) + } render() { @@ -159,17 +212,19 @@ class LineChart extends AbstractChart { ...config, paddingRight, paddingTop, - data: data.datasets[0].data + // data: data.datasets[0].data + data: data.datasets + })} {withShadow && this.renderShadow({ ...config, - data: data.datasets[0].data, + data: data.datasets, paddingRight, paddingTop })} {withDots && this.renderDots({ ...config, - data: data.datasets[0].data, + data: data.datasets, paddingTop, paddingRight })}