From 2f3366ad733c0429f02b48695c9935bb3517d4f9 Mon Sep 17 00:00:00 2001 From: Masayuki Tanaka Date: Thu, 9 May 2013 19:25:30 +0900 Subject: [PATCH] Fix bar x position --- c3.js | 47 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 36 insertions(+), 11 deletions(-) diff --git a/c3.js b/c3.js index 95756a6..4ee9239 100644 --- a/c3.js +++ b/c3.js @@ -376,6 +376,23 @@ } return false } + function getTargetsNum (filter) { + return typeof filter !== 'undefined' ? c3.data.targets.filter(isBarType).length : c3.data.targets.length; + } + function getBarTargetIndices () { + var indices = [] + c3.data.targets.forEach(function(d,i) { + if (isBarType(d)) { + indices.push(i) + } + }) + return indices + } + function getBarX (barWidth, barTargetsNum, barIndices) { + return function (d) { + return x(d.x) - barWidth * (barTargetsNum/2 - barIndices.indexOf(d.i)) + } + } function isLineType (d) { var id = (typeof d === 'string') ? d : d.id return !(id in __data_types) || __data_types[id] === 'line' @@ -610,8 +627,8 @@ .enter().append("rect") .attr("class", function(d,i){ return "event-rect event-rect-"+i }) .style("cursor", function(d){ return __data_selection_enabled && __data_selection_grouped ? "pointer" : null }) - .attr("x", function(d) { return x(d.x) - (rectWidth/2) }) - .attr("y", function(d) { return 0 }) + .attr("x", function(d){ return x(d.x) - (rectWidth/2) }) + .attr("y", function(d){ return 0 }) .attr("width", rectWidth) .attr("height", height) .on('mouseover', function(d,i) { @@ -817,7 +834,8 @@ function update (withTransition) { var xgrid, xgridData, xgridLine var mainPath, mainCircle, mainBar, contextPath - var targetsNum = Object.keys(c3.data.targets).length, rectWidth, barWidth + var barTargetsNum = getTargetsNum(isBarType), barWidth, barIndices, barX + var rectWidth x.domain(brush.empty() ? x2.domain() : brush.extent()) @@ -871,11 +889,14 @@ .attr("cy", function(d) { return y(d.value) }) // bars - barWidth = (xAxis.tickOffset()*2*0.6) / targetsNum + barWidth = (xAxis.tickOffset()*2*0.6) / barTargetsNum + barIndices = getBarTargetIndices() + barX = getBarX(barWidth, barTargetsNum, barIndices) + mainBar = main.selectAll('.target').selectAll('.target-bar').filter(isBarType) if (withTransition) mainBar = mainBar.transition() mainBar.attr("width", barWidth) - .attr("x", function(d){ return x(d.x) - barWidth * (targetsNum/2-d.i) }) + .attr("x", barX) // subchart if (__subchart_show) { @@ -900,8 +921,7 @@ } function draw (targets) { - var targetsNum = Object.keys(c3.data.targets).length - var barWidth = 0, bar2Width = 0 + var barTargetsNum = getTargetsNum(isBarType), barWidth = 0, bar2Width = 0, barIndices, barX var f, c /*-- Main --*/ @@ -947,7 +967,10 @@ }) // Rects for each data - barWidth = (xAxis.tickOffset()*2*0.6) / targetsNum + barWidth = (xAxis.tickOffset()*2*0.6) / barTargetsNum + barIndices = getBarTargetIndices() + barX = getBarX(barWidth, barTargetsNum, barIndices) + f.append('g') .attr("class", function(d){ return "target-bars target-bars-" + d.id }) .style("fill", function(d){ return color(d.id) }) @@ -956,7 +979,7 @@ .data(function(d){ return d.values }) .enter().append("rect") .attr("class", function(d,i){ return "target-bar target-bar-" + i }) - .attr("x", function(d){ return x(d.x) - barWidth * (targetsNum/2-d.i) }) + .attr("x", barX) .attr("y", function(d){ return y(d.value) }) .attr("width", barWidth) .attr("height", function(d){ return height-y(d.value) }) @@ -996,7 +1019,9 @@ .attr("d", function (d) { return line2(d.values) }) // Rects for each data - bar2Width = (xAxis2.tickOffset()*2*0.6) / targetsNum + bar2Width = (xAxis2.tickOffset()*2*0.6) / barTargetsNum + barX = getBarX(bar2Width, barTargetsNum, barIndices) + c.append('g') .attr("class", function(d){ return "target-bars target-bars-" + d.id }) .style("fill", function(d){ return color(d.id) }) @@ -1005,7 +1030,7 @@ .data(function(d){ return d.values }) .enter().append("rect") .attr("class", function(d,i){ return "target-bar target-bar-" + i }) - .attr("x", function(d){ return x2(d.x) - bar2Width * (targetsNum/2-d.i) }) + .attr("x", barX) .attr("y", function(d){ return y2(d.value) }) .attr("width", bar2Width) .attr("height", function(d){ return height2-y2(d.value) })