Skip to content

Commit c3efb84

Browse files
author
Maciej Maciaszek
committed
Fix legend for multibar
1 parent 63d0e09 commit c3efb84

File tree

1 file changed

+24
-9
lines changed

1 file changed

+24
-9
lines changed

src/models/historicalBar.js

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,30 @@ nv.models.historicalBar = function() {
4141
nv.utils.initSVG(container);
4242

4343
// 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;
4557

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
4662
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 ]);
4864
else
4965
x.range(xRange || [0, availableWidth]);
5066

51-
y.domain(yDomain || d3.extent(data[0].values.map(getY).concat(forceY) ))
67+
y.domain(yDomain || d3.extent(merged.map(_getY).concat(forceY) ))
5268
.range(yRange || [availableHeight, 0]);
5369

5470
// 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() {
6379
: y.domain([-1,1]);
6480

6581
// 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]);
6783
var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-historicalBar-' + id);
6884
var defsEnter = wrapEnter.append('defs');
6985
var gEnter = wrapEnter.append('g');
@@ -93,12 +109,12 @@ nv.models.historicalBar = function() {
93109
g.attr('clip-path', clipEdge ? 'url(#nv-chart-clip-path-' + id + ')' : '');
94110

95111
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: []; });
97113
bars.exit().remove();
98114

99115
bars.enter().append('rect')
100116
.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)))) })
102118
.attr('height', function(d,i) { return nv.utils.NaNtoZero(Math.abs(y(getY(d,i)) - y(0))) })
103119
.attr('transform', function(d,i) { return 'translate(' + (x(getX(d,i)) - availableWidth / data[0].values.length * .45) + ',0)'; })
104120
.on('mouseover', function(d,i) {
@@ -153,10 +169,9 @@ nv.models.historicalBar = function() {
153169
bars
154170
.attr('fill', function(d,i) { return color(d, i); })
155171
.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)'; })
158173
//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 );
160175

161176
bars.watchTransition(renderWatch, 'bars')
162177
.attr('y', function(d,i) {

0 commit comments

Comments
 (0)