| <!DOCTYPE html> |
| <meta charset="utf-8"> |
| <link href="../src/nv.d3.css" rel="stylesheet" type="text/css"> |
| <style> |
| |
| /* |
| * { |
| margin: 0; |
| padding: 0; |
| border: 0; |
| } |
| */ |
| |
| |
| body { |
| font-family: sans-serif; |
| } |
| |
| svg { |
| top: 10px; |
| left: 10px; |
| position: absolute; |
| } |
| |
| svg > g > path { |
| pointer-events: none; |
| } |
| |
| .nv-horizonBackground { |
| fill: none; |
| stroke: none; |
| pointer-events: all; |
| } |
| |
| #horizon-controls { |
| position: absolute; |
| width: 940px; |
| padding: 10px; |
| z-index: 1; |
| } |
| |
| #horizon-bands { |
| float: right; |
| } |
| |
| |
| </style> |
| <body> |
| |
| <div id="wrap"> |
| |
| <div id="horizon-controls"> |
| <input name="mode" type="radio" value="mirror" id="horizon-mode-mirror" checked><label for="horizon-mode-mirror"> Mirror</label> |
| <input name="mode" type="radio" value="offset" id="horizon-mode-offset"><label for="horizon-mode-offset"> Offset</label> |
| <span id="horizon-bands"><span id="horizon-bands-value">1</span> <button class="first">−</button><button class="last">+</button></span> |
| </div> |
| <div><svg id="chart1"></svg></div> |
| |
| </div> |
| |
| |
| <script src="../lib/d3.v2.js"></script> |
| <script src="../lib/horizon.js"></script> |
| <script src="../nv.d3.js"></script> |
| <script src="../src/utils.js"></script> |
| <script> |
| |
| |
| //TODO: create a nv.models.horizonChart model |
| // (if need be an nv.models.horizon model as well, but might get away with just using d3.horizon) |
| // the horizontChart model should have a "tooltip" like functionality that shows a point over the |
| // current value based on the mouse's x position |
| |
| var width = 960, |
| height = 300; |
| |
| nv.addGraph(function() { |
| var data = sine(); |
| |
| var chart = d3.horizon() |
| .width(width) |
| .height(height) |
| .bands(1) |
| .mode("mirror") |
| .interpolate("basis"); |
| |
| var svg = d3.select('#chart1').attr('width', width).attr('height', height); |
| |
| var bg = svg.append('rect').attr('class', 'nv-horizonBackground').attr('height', height).attr('width', width); |
| |
| svg.datum(data).call(chart); |
| |
| var point = svg.append('circle').attr('class', 'nv-hoverPoint') |
| .attr('r', '4') |
| .attr('cx', -3) |
| .attr('cy', -3); |
| |
| // Enable mode buttons. |
| d3.selectAll("#horizon-controls input[name=mode]").on("change", function() { |
| svg.call(chart.duration(0).mode(this.value)); |
| }); |
| |
| // Enable bands buttons. |
| d3.selectAll("#horizon-bands button").data([-1, 1]).on("click", function(d) { |
| var n = Math.max(1, chart.bands() + d); |
| d3.select("#horizon-bands-value").text(n); |
| svg.call(chart.duration(1000).bands(n).height(height / n)); |
| |
| //just updating point temporarily here to have it not be visible on band change until user moves his mouse over the chart |
| point |
| .attr('cx', -3) |
| .attr('cy', -3) |
| }); |
| |
| |
| //****THE CHANGES MADE TO THIS EXAMPLE BY ME ARE VERY UGLY.... TODO: Fix/Clean up after all functionality is correct |
| bg.on('mousemove', function() { |
| var m1 = d3.mouse(this); |
| var x = m1[0]; |
| var scales = svg.node().__chart__; |
| var i = Math.round( scales.x.invert(x) ); |
| //var y = (data[i][1] < 0 || chart.mode() == 'mirror' ? height : 0) - scales.y(chart.mode() == 'mirror' ? Math.abs(data[i][1]) : data[i][1] ); |
| var y = height - scales.y(chart.mode() == 'mirror' ? Math.abs(data[i][1]) : data[i][1] ) - (chart.mode() == 'offset' && data[i][1] < 0 ? height : 0 ); |
| var t = scales.t(data[i][1]); |
| var bandRange = scales.y.range()[1]; |
| |
| y = y % (height / chart.bands()); |
| //nv.log(y, height, y % height); |
| |
| //nv.log(scales.y.range(), scales.y.domain()); |
| |
| //nv.log( x, i, data[i], y ) |
| //nv.log(scales); |
| |
| point |
| .attr('cx', scales.x(i)) |
| .attr('cy', y) |
| .attr('transform', |
| 'translate(0,' + chart.bands + ')' |
| ); |
| |
| //var m2 = d3.mouse(d3.select('body').node()); |
| //nv.log(m1, m2); |
| //nv.log(d3.event, this, d3.mouse(this)); |
| }); |
| |
| return chart; |
| }); |
| |
| |
| |
| function sine() { |
| var sin = []; |
| |
| for (var i = 0; i < 200; i++) { |
| sin.push([ i, Math.sin(i/10) + .2 ]); |
| } |
| |
| return sin; |
| } |
| |
| |
| </script> |