b102af9edd
'singlePoint'.
476 lines
12 KiB
HTML
476 lines
12 KiB
HTML
<!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>
|