2 nv.models.sparkline = function() {
4 //============================================================
5 // Public Variables with Default Settings
6 //------------------------------------------------------------
8 var margin = {top: 2, right: 0, bottom: 2, left: 0}
12 , x = d3.scale.linear()
13 , y = d3.scale.linear()
14 , getX = function(d) { return d.x }
15 , getY = function(d) { return d.y }
16 , color = nv.utils.getColor(['#000'])
23 //============================================================
26 function chart(selection) {
27 selection.each(function(data) {
28 var availableWidth = width - margin.left - margin.right,
29 availableHeight = height - margin.top - margin.bottom,
30 container = d3.select(this);
33 //------------------------------------------------------------
36 x .domain(xDomain || d3.extent(data, getX ))
37 .range(xRange || [0, availableWidth]);
39 y .domain(yDomain || d3.extent(data, getY ))
40 .range(yRange || [availableHeight, 0]);
42 //------------------------------------------------------------
45 //------------------------------------------------------------
46 // Setup containers and skeleton of chart
48 var wrap = container.selectAll('g.nv-wrap.nv-sparkline').data([data]);
49 var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-sparkline');
50 var gEnter = wrapEnter.append('g');
51 var g = wrap.select('g');
53 wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')')
55 //------------------------------------------------------------
58 var paths = wrap.selectAll('path')
59 .data(function(d) { return [d] });
60 paths.enter().append('path');
61 paths.exit().remove();
63 .style('stroke', function(d,i) { return d.color || color(d, i) })
64 .attr('d', d3.svg.line()
65 .x(function(d,i) { return x(getX(d,i)) })
66 .y(function(d,i) { return y(getY(d,i)) })
70 // TODO: Add CURRENT data point (Need Min, Mac, Current / Most recent)
71 var points = wrap.selectAll('circle.nv-point')
72 .data(function(data) {
73 var yValues = data.map(function(d, i) { return getY(d,i); });
74 function pointIndex(index) {
76 var result = data[index];
77 result.pointIndex = index;
83 var maxPoint = pointIndex(yValues.lastIndexOf(y.domain()[1])),
84 minPoint = pointIndex(yValues.indexOf(y.domain()[0])),
85 currentPoint = pointIndex(yValues.length - 1);
86 return [minPoint, maxPoint, currentPoint].filter(function (d) {return d != null;});
88 points.enter().append('circle');
89 points.exit().remove();
91 .attr('cx', function(d,i) { return x(getX(d,d.pointIndex)) })
92 .attr('cy', function(d,i) { return y(getY(d,d.pointIndex)) })
94 .attr('class', function(d,i) {
95 return getX(d, d.pointIndex) == x.domain()[1] ? 'nv-point nv-currentValue' :
96 getY(d, d.pointIndex) == y.domain()[0] ? 'nv-point nv-minValue' : 'nv-point nv-maxValue'
104 //============================================================
105 // Expose Public Variables
106 //------------------------------------------------------------
107 chart.options = nv.utils.optionsFunc.bind(chart);
109 chart.margin = function(_) {
110 if (!arguments.length) return margin;
111 margin.top = typeof _.top != 'undefined' ? _.top : margin.top;
112 margin.right = typeof _.right != 'undefined' ? _.right : margin.right;
113 margin.bottom = typeof _.bottom != 'undefined' ? _.bottom : margin.bottom;
114 margin.left = typeof _.left != 'undefined' ? _.left : margin.left;
118 chart.width = function(_) {
119 if (!arguments.length) return width;
124 chart.height = function(_) {
125 if (!arguments.length) return height;
130 chart.x = function(_) {
131 if (!arguments.length) return getX;
132 getX = d3.functor(_);
136 chart.y = function(_) {
137 if (!arguments.length) return getY;
138 getY = d3.functor(_);
142 chart.xScale = function(_) {
143 if (!arguments.length) return x;
148 chart.yScale = function(_) {
149 if (!arguments.length) return y;
154 chart.xDomain = function(_) {
155 if (!arguments.length) return xDomain;
160 chart.yDomain = function(_) {
161 if (!arguments.length) return yDomain;
166 chart.xRange = function(_) {
167 if (!arguments.length) return xRange;
172 chart.yRange = function(_) {
173 if (!arguments.length) return yRange;
178 chart.animate = function(_) {
179 if (!arguments.length) return animate;
184 chart.color = function(_) {
185 if (!arguments.length) return color;
186 color = nv.utils.getColor(_);
190 //============================================================