| <!DOCTYPE html> |
| <meta charset="utf-8"> |
| |
| <link href="../src/nv.d3.css" rel="stylesheet" type="text/css"> |
| <link href="teststyle.css" rel="stylesheet" type='text/css'> |
| <style> |
| #chart13, #chart14 { |
| overflow: scroll; |
| width: 500px; |
| height: 300px; |
| } |
| |
| #chart13 svg, #chart14 svg { |
| width: 700px; |
| height: 400px; |
| } |
| </style> |
| <body> |
| <h3>Line chart test cases - feel free to add more tests</h3> |
| <div style='position:relative;'> |
| <div class='navigation'> |
| Tests: |
| <a href="lineChartTest.html">Line Chart</a> |
| <a href="stackedAreaChartTest.html">Stacked Area</a> |
| <a href="../examples/cumulativeLineChart.html">Cumulative Line</a> |
| <a href="ScatterChartTest.html">Scatter</a> |
| <a href="pieChartTest.html">Pie chart</a> |
| <a href="realTimeChartTest.html">Real time test</a> |
| <a href="polylinearTest.html">Polylinear test</a> |
| <a href="interactiveBisectTest.html">nv.interactiveBisect unit tests</a> |
| </div> |
| <div class='chart full' id='chart1'> |
| Example of chart with many series', and new interactive guideline plus tooltip. A chunk of data was purposely removed |
| to show how the chart handles it. |
| <button>Select chart</button> |
| <svg></svg> |
| </div> |
| <div class='chart half with-transitions' id='chart2'> |
| Chart with old tooltip style (with-transitions). |
| <button>Select chart</button> |
| <svg></svg> |
| </div> |
| <div class='chart half' id='chart3'> |
| Chart with three data points. |
| <button>Select chart</button> |
| <svg></svg> |
| </div> |
| <div class='chart third' id='chart4'> |
| Chart where two series have different number of points. |
| <button>Select chart</button> |
| <svg></svg> |
| </div> |
| <div class='chart third' id='chart5'> |
| Chart with one point. |
| <button>Select chart</button> |
| <svg></svg> |
| </div> |
| <div class='chart third' id='chart6'> |
| Chart with 1000 points. |
| <button>Select chart</button> |
| <svg></svg> |
| </div> |
| |
| <div class='chart third' id='chart7'> |
| Chart with no data. |
| <button>Select chart</button> |
| <svg></svg> |
| </div> |
| <div class='chart third' id='chart8'> |
| All points random. No order. |
| <button>Select chart</button> |
| <svg></svg> |
| </div> |
| <div class='chart third' id='chart9'> |
| Points do not increase linearly. |
| <button>Select chart</button> |
| <svg></svg> |
| </div> |
| |
| <div class='chart third' id='chart10'> |
| Chart with 15 series' |
| <button>Select chart</button> |
| <svg></svg> |
| </div> |
| <div class='chart third' id='chart11'> |
| Data points go backwards |
| <button>Select chart</button> |
| <svg></svg> |
| </div> |
| <div class='chart third' id='chart12'> |
| Duplicate X coordinate points. |
| <button>Select chart</button> |
| <svg></svg> |
| </div> |
| |
| <div class='chart third' id='chart16'> |
| Duplicate Y coordinate points. |
| <button>Select chart</button> |
| <svg></svg> |
| </div> |
| |
| <div class='chart third' id='chart13'> |
| Chart in a overflow div with scrolls (new tooltips) |
| <button>Select chart</button> |
| <svg></svg> |
| </div> |
| |
| <div class='chart third' id='chart14'> |
| Chart in a overflow div with scrolls (old tooltips) |
| <button>Select chart</button> |
| <svg></svg> |
| </div> |
| |
| <div style='clear:both;'></div> |
| <div class='chart third' id='chart15'> |
| What if there are null, Infinity and NaN values in points? |
| <button>Select chart</button> |
| <svg></svg> |
| </div> |
| <div class='chart third' id='chart17'> |
| Chart with very small, 1e-10, points (old tooltips) |
| <button>Select chart</button> |
| <svg></svg> |
| </div> |
| </div> |
| |
| <script src="../lib/d3.v3.js"></script> |
| <script src="../nv.d3.js"></script> |
| <script src="../src/tooltip.js"></script> |
| <script src="../src/utils.js"></script> |
| <script src="../src/interactiveLayer.js"></script> |
| <script src="../src/models/legend.js"></script> |
| <script src="../src/models/axis.js"></script> |
| <script src="../src/models/scatter.js"></script> |
| <script src="../src/models/line.js"></script> |
| <script src="../src/models/lineChart.js"></script> |
| <script src="testScript.js"></script> |
| <script> |
| |
| d3.select("body").on("keydown",function() { |
| if (d3.event.ctrlKey && d3.event.which === 75) { |
| alert("keydowned"); |
| } |
| }); |
| //------------ CHART 1 |
| defaultChartConfig("chart1", dummyStocks(),true, true, {forceY:false}); |
| |
| //-------------- CHART 2 --- Chart without the interactive guideline. |
| nv.addGraph(function() { |
| var chart; |
| chart = nv.models.lineChart().useInteractiveGuideline(false); |
| |
| chart |
| .x(function(d,i) { return d.x }); |
| |
| |
| chart.xAxis // chart sub-models (ie. xAxis, yAxis, etc) when accessed directly, return themselves, not the parent chart, so need to chain separately |
| .tickFormat(d3.format(',.1f')); |
| |
| chart.yAxis |
| .axisLabel('Voltage (v)') |
| .tickFormat(d3.format(',.4f')); |
| |
| chart.showXAxis(true).showYAxis(true).rightAlignYAxis(true).margin({right: 90}); |
| |
| d3.select('#chart2 svg') |
| //.datum([]) //for testing noData |
| .datum(dummyStocks(50)) |
| .transition().duration(500) |
| .call(chart); |
| |
| nv.utils.windowResize(chart.update); |
| |
| return chart; |
| }); |
| |
| defaultChartConfig("chart3", smallDataSet(3)); |
| defaultChartConfig("chart4", badDataSet()); |
| defaultChartConfig("chart5", smallDataSet(1)); |
| defaultChartConfig("chart6", normalDist()); |
| |
| defaultChartConfig("chart7", smallDataSet(0)); |
| defaultChartConfig("chart8", allRandom(),false); |
| defaultChartConfig("chart9", fibonacci()); |
| |
| defaultChartConfig("chart10", lotsofSeries()); |
| defaultChartConfig("chart11", backwards(),false); |
| defaultChartConfig("chart12", duplicateX(),false); |
| defaultChartConfig("chart13",hyperbole(), true, false, {width: 700, height: 400}); |
| defaultChartConfig("chart14",hyperbole(), false, false, {width: 700, height: 400}); |
| defaultChartConfig("chart15", withNaNs()); |
| defaultChartConfig("chart16", duplicateY(), false); |
| defaultChartConfig("chart17", tinyPoints(), false); |
| |
| function defaultChartConfig(containerid, data, guideline, useDates, auxOptions) { |
| if (auxOptions === undefined) auxOptions = {}; |
| if (guideline === undefined) guideline = true; |
| nv.addGraph(function() { |
| var chart; |
| chart = nv.models.lineChart().useInteractiveGuideline(guideline); |
| |
| chart |
| .x(function(d,i) { |
| return d.x; |
| }); |
| |
| if (auxOptions.width) |
| chart.width(auxOptions.width); |
| |
| if (auxOptions.height) |
| chart.height(auxOptions.height); |
| |
| if (auxOptions.forceY) |
| chart.forceY([0]); |
| |
| var formatter; |
| if (useDates !== undefined) { |
| formatter = function(d,i) { |
| var now = (new Date()).getTime() - 86400 * 1000 * 365; |
| now = new Date(now + d * 86400 * 1000); |
| return d3.time.format('%b %d %Y')(now ); |
| } |
| } |
| else { |
| formatter = d3.format(",.1f"); |
| } |
| chart.margin({right: 40}); |
| chart.xAxis // chart sub-models (ie. xAxis, yAxis, etc) when accessed directly, return themselves, not the parent chart, so need to chain separately |
| .tickFormat( |
| formatter |
| ); |
| |
| chart.yAxis |
| .axisLabel('Voltage (v)') |
| .tickFormat(d3.format(',.2f')); |
| |
| |
| d3.select('#' + containerid + ' svg') |
| .datum(data) |
| .transition().duration(500) |
| .call(chart); |
| |
| nv.utils.windowResize(chart.update); |
| |
| return chart; |
| }); |
| } |
| |
| function sinAndCos() { |
| var sin = [], |
| cos = [], |
| rand = [], |
| rand2 = [] |
| ; |
| |
| var now = (new Date()).getTime(); |
| for (var i = 0; i < 100; i++) { |
| sin.push({x: i, y: i % 10 == 5 ? null : Math.sin(i/10) }); //the nulls are to show how defined works |
| cos.push({x: i, y: .5 * Math.cos(i/10)}); |
| rand.push({x:i, y: Math.random() / 10}); |
| rand2.push({x: i, y: Math.cos(i/10) + Math.random() / 10 }) |
| } |
| |
| return [ |
| { |
| area: true, |
| values: sin, |
| key: "Sine Wave", |
| color: "#ff7f0e" |
| }, |
| { |
| values: cos, |
| key: "Cosine Wave", |
| color: "#2ca02c" |
| }, |
| { |
| values: rand, |
| key: "Random Points", |
| color: "#2222ff" |
| } |
| , |
| { |
| values: rand2, |
| key: "Random Cosine", |
| color: "#667711" |
| } |
| ]; |
| } |
| |
| function hyperbole() { |
| var series1 = [], series2 = [], series3 = []; |
| for(var i = 1; i < 100; i++) { |
| series1.push({x: i, y: 1 / i}); |
| series2.push({x: i, y: 5 / i}); |
| series3.push({x: i, y: -8 / i}); |
| } |
| |
| return [ |
| {values: series1, key: "Series 1"}, |
| {values: series2, key: "Series 2"}, |
| {values: series3, key: "Series 3"} |
| ]; |
| } |
| |
| function smallDataSet(n) { |
| var series = []; |
| for(var i = 0; i < n; i++) { |
| series.push({x: i, y: i * 0.3 + 2}) |
| } |
| return [ |
| {values: series, key: "Line 1"} |
| ]; |
| } |
| |
| function badDataSet() { |
| var series1 = [], series2 = []; |
| for(var i =0; i < 30; i++) { |
| series1.push({x:i, y: i*0.3 + 12}); |
| } |
| for(i = 0; i < 30; i += 5) { |
| series2.push({x:i, y: i*0.7 + 8}); |
| } |
| return [ |
| {values: series1, key:"Series 1"}, |
| {values: series2, key:"Series 2"} |
| ]; |
| } |
| |
| function normalDist() { |
| var series1 = [], series2 = []; |
| for(var i = -500; i < 500; i += 1) { |
| var x = i / 100; |
| var y = 0.3989 * Math.pow(2.71, -0.5*x*x); |
| series1.push({x:i, y:y}); |
| series2.push({x:i, y:y*2}); |
| } |
| return [ |
| {values: series1, key:"Normal 1", area:true}, |
| {values: series2, key:"Normal 2"}]; |
| } |
| |
| |
| function allRandom() { |
| var series = []; |
| for(var i = 0; i < 20; i++) { |
| series.push({x: Math.floor(Math.random()*20), y: Math.floor(Math.random()*20) }); |
| } |
| return [{values: series,area:true, key: "Total Chaos"}]; |
| } |
| |
| function fibonacci() { |
| var series = [ |
| {x:1, y:1}, |
| {x:2, y:2.5}, |
| {x:3, y:4}, |
| {x:5, y:6.7}, |
| {x:8, y:10.1}, |
| {x:13, y:20.1}, |
| {x:21, y:35.1}, |
| {x:34, y:60.0}, |
| {x:55, y:70.9}, |
| {x:89, y:100.3} |
| ]; |
| |
| return [{values: series,area:true,color: "#22fb88", key: "Fibonacci"}]; |
| } |
| |
| function lotsofSeries() { |
| var rval = []; |
| for(var n = 0; n < 15; n++) { |
| var values = []; |
| var slope = Math.random() * 5; |
| for(var i =0; i < 30; i++) { |
| values.push( |
| {x: i, |
| y: i * slope + Math.random()*5} |
| ); |
| } |
| var isArea = (Math.random() > 0.5); |
| rval.push({key: "Series " + n, area: isArea, values: values}); |
| } |
| return rval; |
| } |
| |
| function backwards() { |
| var series = []; |
| for(var i = 30; i >= 1; i--) { |
| series.push({x: i, y: Math.sqrt(i) }); |
| } |
| return [{values: series, key: "Backwards series", area:true}]; |
| } |
| |
| function duplicateX() { |
| return [ |
| {key: "Duplicate X", |
| area: true, |
| values: [ |
| {x: 4, y: 10}, |
| {x: 4, y: 11}, |
| {x: 4, y: 12}, |
| {x: 4, y: 13} |
| ] |
| } |
| ]; |
| } |
| |
| function duplicateY() { |
| return [ |
| {key: "Duplicate Y", |
| values: [ |
| {x: 0, y: 10}, {x:1, y:10},{x:2, y:10},{x:3, y:10} |
| ] |
| } |
| ]; |
| } |
| |
| function withNaNs() { |
| return [ |
| {key: "NaN Points", |
| values: [ |
| {x: 1, y: NaN}, |
| {x: 2, y: undefined}, |
| {x: 3, y: false}, |
| {x: 4, y: null}, |
| {x: 5, y: "Hello"}, |
| {x: NaN, y: NaN}, |
| {x: null, y: null}, |
| {x: undefined, y: undefined}, |
| {x: "Hello", y: "World"}, |
| {x: Infinity, y: Infinity} |
| ] |
| } |
| ] |
| } |
| |
| function tinyPoints() { |
| var rval = {key: "Tiny points", values: []}; |
| for(var i =1; i < 20; i++) { |
| rval.values.push({ |
| x: i, |
| y: Math.random() * 1e-10 |
| }); |
| } |
| return [rval]; |
| } |
| |
| function dummyStocks(numPoints) { |
| numPoints = numPoints || 200; |
| function volatileChart(key,startPrice, volatility, isArea) { |
| var rval = {key: key, values: []}; |
| if (isArea) rval.area = true; |
| for(var i = 1; i < numPoints; i++) { |
| |
| rval.values.push({x: i, y: (i > 110 && i < 130) ? null : startPrice}); |
| var rnd = Math.random(); |
| var changePct = 2 * volatility * rnd; |
| if ( changePct > volatility) { |
| changePct -= (2*volatility); |
| } |
| |
| startPrice = startPrice + startPrice * changePct; |
| |
| } |
| return rval; |
| } |
| |
| var stocks = []; |
| stocks.push(volatileChart("APPL",5.00, 0.02)); |
| stocks.push(volatileChart("GOOG", 6.01,0.024)); |
| stocks.push(volatileChart("MSFT", 2.01, 0.012)); |
| stocks.push(volatileChart("IBM US", 2.5, 0.08, true)); |
| return stocks; |
| } |
| |
| </script> |