Horizontal barcan nopw stack with both positive and negative, verticaly aligned values with center of bar

master-patched
Bob Monteverde 11 years ago
parent 4fccaa8cb7
commit d4566d25e7

@ -132,10 +132,231 @@ long_short_data = [
"value" : 0
}
]
},
{
key: 'Series3',
color: '#2ca02c',
values: [
{
"label" : "Group A" ,
"value" : -25.307646510375
} ,
{
"label" : "Group B" ,
"value" : 16.756779544553
} ,
{
"label" : "Group C" ,
"value" : -18.451534877007
} ,
{
"label" : "Group D" ,
"value" : 8.6142352811805
} ,
{
"label" : "Group E" ,
"value" : -7.8082472075876
} ,
{
"label" : "Group F" ,
"value" : 5.259101026956
} ,
{
"label" : "Group G" ,
"value" : -0.30947953487127
} ,
{
"label" : "Group H" ,
"value" : 0
} ,
{
"label" : "Group I" ,
"value" : 0
}
]
}
];
long_short_pos_data = [
{
key: 'Series1',
color: '#d62728',
values: [
{
"label" : "Group A" ,
"value" : 1.8746444827653
} ,
{
"label" : "Group B" ,
"value" : 8.0961543492239
} ,
{
"label" : "Group C" ,
"value" : 0.57072943117674
} ,
{
"label" : "Group D" ,
"value" : 2.4174010336624
} ,
{
"label" : "Group E" ,
"value" : 0.72009071426284
} ,
{
"label" : "Group F" ,
"value" : 0.77154485523777
} ,
{
"label" : "Group G" ,
"value" : 0.90152097798131
} ,
{
"label" : "Group H" ,
"value" : 0.91445417330854
} ,
{
"label" : "Group I" ,
"value" : 0.055746319141851
}
]
},
{
key: 'Series2',
color: '#1f77b4',
values: [
{
"label" : "Group A" ,
"value" : 25.307646510375
} ,
{
"label" : "Group B" ,
"value" : 16.756779544553
} ,
{
"label" : "Group C" ,
"value" : 18.451534877007
} ,
{
"label" : "Group D" ,
"value" : 8.6142352811805
} ,
{
"label" : "Group E" ,
"value" : 7.8082472075876
} ,
{
"label" : "Group F" ,
"value" : 5.259101026956
} ,
{
"label" : "Group G" ,
"value" : 0.30947953487127
} ,
{
"label" : "Group H" ,
"value" : 0
} ,
{
"label" : "Group I" ,
"value" : 0
}
]
}
];
long_short_neg_data = [
{
key: 'Series1',
color: '#d62728',
values: [
{
"label" : "Group A" ,
"value" : -1.8746444827653
} ,
{
"label" : "Group B" ,
"value" : -8.0961543492239
} ,
{
"label" : "Group C" ,
"value" : -0.57072943117674
} ,
{
"label" : "Group D" ,
"value" : -2.4174010336624
} ,
{
"label" : "Group E" ,
"value" : -0.72009071426284
} ,
{
"label" : "Group F" ,
"value" : -0.77154485523777
} ,
{
"label" : "Group G" ,
"value" : -0.90152097798131
} ,
{
"label" : "Group H" ,
"value" : -0.91445417330854
} ,
{
"label" : "Group I" ,
"value" : -0.055746319141851
}
]
},
{
key: 'Series2',
color: '#1f77b4',
values: [
{
"label" : "Group A" ,
"value" : -25.307646510375
} ,
{
"label" : "Group B" ,
"value" : -16.756779544553
} ,
{
"label" : "Group C" ,
"value" : -18.451534877007
} ,
{
"label" : "Group D" ,
"value" : -8.6142352811805
} ,
{
"label" : "Group E" ,
"value" : -7.8082472075876
} ,
{
"label" : "Group F" ,
"value" : -5.259101026956
} ,
{
"label" : "Group G" ,
"value" : -0.30947953487127
} ,
{
"label" : "Group H" ,
"value" : 0
} ,
{
"label" : "Group I" ,
"value" : 0
}
]
}
];
var chart;
nv.addGraph(function() {
chart = nv.models.multiBarHorizontalChart()
@ -144,7 +365,7 @@ nv.addGraph(function() {
.margin({top: 30, right: 20, bottom: 50, left: 175})
.showValues(true)
.tooltips(false)
.showControls(false);
.showControls(true);
chart.yAxis
.tickFormat(d3.format(',.2f'));

@ -6157,6 +6157,28 @@ nv.models.multiBarHorizontal = function() {
});
//------------------------------------------------------------
// HACK for negative value stacking
if (stacked)
data[0].values.map(function(d,i) {
var posBase = 0, negBase = 0;
data.map(function(d) {
var f = d.values[i]
f.size = Math.abs(f.y);
if (f.y<0) {
f.y1 = negBase - f.size;
negBase = negBase - f.size;
} else
{
f.y1 = posBase;
posBase = posBase + f.size;
}
});
});
//------------------------------------------------------------
// Setup Scales
@ -6164,14 +6186,15 @@ nv.models.multiBarHorizontal = function() {
var seriesData = (xDomain && yDomain) ? [] : // if we know xDomain and yDomain, no need to calculate
data.map(function(d) {
return d.values.map(function(d,i) {
return { x: getX(d,i), y: getY(d,i), y0: d.y0 }
return { x: getX(d,i), y: getY(d,i), y0: d.y0, y1: d.y1 }
})
});
x .domain(xDomain || d3.merge(seriesData).map(function(d) { return d.x }))
.rangeBands([0, availableHeight], .1);
y .domain(yDomain || d3.extent(d3.merge(seriesData).map(function(d) { return d.y + (stacked ? d.y0 : 0) }).concat(forceY)))
//y .domain(yDomain || d3.extent(d3.merge(seriesData).map(function(d) { return d.y + (stacked ? d.y0 : 0) }).concat(forceY)))
y .domain(yDomain || d3.extent(d3.merge(seriesData).map(function(d) { return stacked ? (d.y > 0 ? d.y1 + d.y : d.y1 ) : d.y }).concat(forceY)))
if (showValues && !stacked)
y.range([(y.domain()[0] < 0 ? valuePadding : 0), availableWidth - (y.domain()[1] > 0 ? valuePadding : 0) ]);
@ -6284,19 +6307,22 @@ nv.models.multiBarHorizontal = function() {
d3.event.stopPropagation();
});
barsEnter.append('text');
if (showValues && !stacked) {
barsEnter.append('text')
.attr('text-anchor', function(d,i) { return getY(d,i) < 0 ? 'end' : 'start' })
bars.select('text')
.attr('y', x.rangeBand() / 2)
.attr('dy', '-.32em')
.attr('text-anchor', function(d,i) { return getY(d,i) < 0 ? 'end' : 'start' })
.attr('y', x.rangeBand() / (data.length * 2))
.attr('dy', '.32em')
.text(function(d,i) { return valueFormat(getY(d,i)) })
d3.transition(bars)
//.delay(function(d,i) { return i * delay / data[0].values.length })
.select('text')
.attr('x', function(d,i) { return getY(d,i) < 0 ? -4 : y(getY(d,i)) - y(0) + 4 })
} else {
bars.selectAll('text').remove();
//bars.selectAll('text').remove();
bars.selectAll('text').text('');
}
bars
@ -6311,7 +6337,8 @@ nv.models.multiBarHorizontal = function() {
//.delay(function(d,i) { return i * delay / data[0].values.length })
.attr('transform', function(d,i) {
//return 'translate(' + y(d.y0) + ',0)'
return 'translate(' + y(d.y0) + ',' + x(getX(d,i)) + ')'
//return 'translate(' + y(d.y0) + ',' + x(getX(d,i)) + ')'
return 'translate(' + y(d.y1) + ',' + x(getX(d,i)) + ')'
})
.select('rect')
.attr('width', function(d,i) {

10
nv.d3.min.js vendored

File diff suppressed because one or more lines are too long

@ -64,6 +64,28 @@ nv.models.multiBarHorizontal = function() {
});
//------------------------------------------------------------
// HACK for negative value stacking
if (stacked)
data[0].values.map(function(d,i) {
var posBase = 0, negBase = 0;
data.map(function(d) {
var f = d.values[i]
f.size = Math.abs(f.y);
if (f.y<0) {
f.y1 = negBase - f.size;
negBase = negBase - f.size;
} else
{
f.y1 = posBase;
posBase = posBase + f.size;
}
});
});
//------------------------------------------------------------
// Setup Scales
@ -71,14 +93,15 @@ nv.models.multiBarHorizontal = function() {
var seriesData = (xDomain && yDomain) ? [] : // if we know xDomain and yDomain, no need to calculate
data.map(function(d) {
return d.values.map(function(d,i) {
return { x: getX(d,i), y: getY(d,i), y0: d.y0 }
return { x: getX(d,i), y: getY(d,i), y0: d.y0, y1: d.y1 }
})
});
x .domain(xDomain || d3.merge(seriesData).map(function(d) { return d.x }))
.rangeBands([0, availableHeight], .1);
y .domain(yDomain || d3.extent(d3.merge(seriesData).map(function(d) { return d.y + (stacked ? d.y0 : 0) }).concat(forceY)))
//y .domain(yDomain || d3.extent(d3.merge(seriesData).map(function(d) { return d.y + (stacked ? d.y0 : 0) }).concat(forceY)))
y .domain(yDomain || d3.extent(d3.merge(seriesData).map(function(d) { return stacked ? (d.y > 0 ? d.y1 + d.y : d.y1 ) : d.y }).concat(forceY)))
if (showValues && !stacked)
y.range([(y.domain()[0] < 0 ? valuePadding : 0), availableWidth - (y.domain()[1] > 0 ? valuePadding : 0) ]);
@ -191,19 +214,22 @@ nv.models.multiBarHorizontal = function() {
d3.event.stopPropagation();
});
barsEnter.append('text');
if (showValues && !stacked) {
barsEnter.append('text')
.attr('text-anchor', function(d,i) { return getY(d,i) < 0 ? 'end' : 'start' })
bars.select('text')
.attr('y', x.rangeBand() / 2)
.attr('dy', '-.32em')
.attr('text-anchor', function(d,i) { return getY(d,i) < 0 ? 'end' : 'start' })
.attr('y', x.rangeBand() / (data.length * 2))
.attr('dy', '.32em')
.text(function(d,i) { return valueFormat(getY(d,i)) })
d3.transition(bars)
//.delay(function(d,i) { return i * delay / data[0].values.length })
.select('text')
.attr('x', function(d,i) { return getY(d,i) < 0 ? -4 : y(getY(d,i)) - y(0) + 4 })
} else {
bars.selectAll('text').remove();
//bars.selectAll('text').remove();
bars.selectAll('text').text('');
}
bars
@ -218,7 +244,8 @@ nv.models.multiBarHorizontal = function() {
//.delay(function(d,i) { return i * delay / data[0].values.length })
.attr('transform', function(d,i) {
//return 'translate(' + y(d.y0) + ',0)'
return 'translate(' + y(d.y0) + ',' + x(getX(d,i)) + ')'
//return 'translate(' + y(d.y0) + ',' + x(getX(d,i)) + ')'
return 'translate(' + y(d.y1) + ',' + x(getX(d,i)) + ')'
})
.select('rect')
.attr('width', function(d,i) {

Loading…
Cancel
Save