@@ -41,14 +41,30 @@ nv.models.historicalBar = function() {
41
41
nv . utils . initSVG ( container ) ;
42
42
43
43
// Setup Scales
44
- x . domain ( xDomain || d3 . extent ( data [ 0 ] . values . map ( getX ) . concat ( forceX ) ) ) ;
44
+ // remap and flatten the data for use in calculating the scales' domains
45
+ var seriesData = ( xDomain && yDomain ) ? [ ] : // if we know xDomain and yDomain, no need to calculate
46
+ data . map ( function ( d , idx ) {
47
+ return d . values . map ( function ( d , i ) {
48
+ return { x : getX ( d , i ) , y : getY ( d , i ) , y0 : d . y0 , y1 : d . y1 , idx :idx }
49
+ } )
50
+ } ) ;
51
+
52
+ var _getX = function ( d ) { return d . x ; } ;
53
+ var _getY = function ( d ) { return d . y ; } ;
54
+ var merged = d3 . merge ( seriesData ) ;
55
+
56
+ var dataValuesLength = data [ 0 ] ? data [ 0 ] . values . length : 0 ;
45
57
58
+ // Setup Scales
59
+ x . domain ( xDomain || d3 . extent ( merged . map ( _getX ) . concat ( forceX ) ) . filter ( function ( el ) { return el !== undefined } ) ) ;
60
+
61
+ // TODO: multichart with historicalBar will throw when data is empty
46
62
if ( padData )
47
- x . range ( xRange || [ availableWidth * .5 / data [ 0 ] . values . length , availableWidth * ( data [ 0 ] . values . length - .5 ) / data [ 0 ] . values . length ] ) ;
63
+ x . range ( xRange || [ availableWidth * .5 / dataValuesLength , availableWidth * ( dataValuesLength - .5 ) / dataValuesLength ] ) ;
48
64
else
49
65
x . range ( xRange || [ 0 , availableWidth ] ) ;
50
66
51
- y . domain ( yDomain || d3 . extent ( data [ 0 ] . values . map ( getY ) . concat ( forceY ) ) )
67
+ y . domain ( yDomain || d3 . extent ( merged . map ( _getY ) . concat ( forceY ) ) )
52
68
. range ( yRange || [ availableHeight , 0 ] ) ;
53
69
54
70
// If scale's domain don't have a range, slightly adjust to make one... so a chart can show a single data point
@@ -63,7 +79,7 @@ nv.models.historicalBar = function() {
63
79
: y . domain ( [ - 1 , 1 ] ) ;
64
80
65
81
// Setup containers and skeleton of chart
66
- var wrap = container . selectAll ( 'g.nv-wrap.nv-historicalBar-' + id ) . data ( [ data [ 0 ] . values ] ) ;
82
+ var wrap = container . selectAll ( 'g.nv-wrap.nv-historicalBar-' + id ) . data ( [ data ] ) ;
67
83
var wrapEnter = wrap . enter ( ) . append ( 'g' ) . attr ( 'class' , 'nvd3 nv-wrap nv-historicalBar-' + id ) ;
68
84
var defsEnter = wrapEnter . append ( 'defs' ) ;
69
85
var gEnter = wrapEnter . append ( 'g' ) ;
@@ -93,12 +109,12 @@ nv.models.historicalBar = function() {
93
109
g . attr ( 'clip-path' , clipEdge ? 'url(#nv-chart-clip-path-' + id + ')' : '' ) ;
94
110
95
111
var bars = wrap . select ( '.nv-bars' ) . selectAll ( '.nv-bar' )
96
- . data ( function ( d ) { return d } , function ( d , i ) { return getX ( d , i ) } ) ;
112
+ . data ( function ( d ) { return d [ 0 ] ? d [ 0 ] . values : [ ] ; } ) ;
97
113
bars . exit ( ) . remove ( ) ;
98
114
99
115
bars . enter ( ) . append ( 'rect' )
100
116
. attr ( 'x' , 0 )
101
- . attr ( 'y' , function ( d , i ) { return nv . utils . NaNtoZero ( y ( Math . max ( 0 , getY ( d , i ) ) ) ) } )
117
+ . attr ( 'y' , function ( d , i ) { return nv . utils . NaNtoZero ( y ( Math . max ( 0 , getY ( d , i ) ) ) ) } )
102
118
. attr ( 'height' , function ( d , i ) { return nv . utils . NaNtoZero ( Math . abs ( y ( getY ( d , i ) ) - y ( 0 ) ) ) } )
103
119
. attr ( 'transform' , function ( d , i ) { return 'translate(' + ( x ( getX ( d , i ) ) - availableWidth / data [ 0 ] . values . length * .45 ) + ',0)' ; } )
104
120
. on ( 'mouseover' , function ( d , i ) {
@@ -153,10 +169,9 @@ nv.models.historicalBar = function() {
153
169
bars
154
170
. attr ( 'fill' , function ( d , i ) { return color ( d , i ) ; } )
155
171
. attr ( 'class' , function ( d , i , j ) { return ( getY ( d , i ) < 0 ? 'nv-bar negative' : 'nv-bar positive' ) + ' nv-bar-' + j + '-' + i } )
156
- . watchTransition ( renderWatch , 'bars' )
157
- . attr ( 'transform' , function ( d , i ) { return 'translate(' + ( x ( getX ( d , i ) ) - availableWidth / data [ 0 ] . values . length * .45 ) + ',0)' ; } )
172
+ . attr ( 'transform' , function ( d , i ) { return 'translate(' + ( x ( getX ( d , i ) ) - availableWidth / dataValuesLength * .45 ) + ',0)' ; } )
158
173
//TODO: better width calculations that don't assume always uniform data spacing;w
159
- . attr ( 'width' , ( availableWidth / data [ 0 ] . values . length ) * .9 ) ;
174
+ . attr ( 'width' , ( availableWidth / dataValuesLength ) * .9 ) ;
160
175
161
176
bars . watchTransition ( renderWatch , 'bars' )
162
177
. attr ( 'y' , function ( d , i ) {
0 commit comments