mirror of https://github.com/masayuki0812/c3.git
Quite good looking graph derived from d3.js
http://c3js.org
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
173 lines
7.1 KiB
173 lines
7.1 KiB
c3_chart_internal_fn.initBrush = function () { |
|
var $$ = this, d3 = $$.d3; |
|
$$.brush = d3.svg.brush().on("brush", function () { $$.redrawForBrush(); }); |
|
$$.brush.update = function () { |
|
if ($$.context) { $$.context.select('.' + $$.CLASS[_brush]).call(this); } |
|
return this; |
|
}; |
|
$$.brush.scale = function (scale) { |
|
return $$.config[__axis_rotated] ? this.y(scale) : this.x(scale); |
|
}; |
|
}; |
|
c3_chart_internal_fn.initSubchart = function () { |
|
var $$ = this, config = $$.config, |
|
context = $$.context = $$.svg.append("g").attr("transform", $$.getTranslate('context')); |
|
|
|
if (!config[__subchart_show]) { |
|
context.style('visibility', 'hidden'); |
|
} |
|
|
|
// Define g for chart area |
|
context.append('g') |
|
.attr("clip-path", $$.clipPath) |
|
.attr('class', CLASS[_chart]); |
|
|
|
// Define g for bar chart area |
|
context.select('.' + CLASS[_chart]).append("g") |
|
.attr("class", CLASS[_chartBars]); |
|
|
|
// Define g for line chart area |
|
context.select('.' + CLASS[_chart]).append("g") |
|
.attr("class", CLASS[_chartLines]); |
|
|
|
// Add extent rect for Brush |
|
context.append("g") |
|
.attr("clip-path", $$.clipPath) |
|
.attr("class", CLASS[_brush]) |
|
.call($$.brush) |
|
.selectAll("rect") |
|
.attr(config[__axis_rotated] ? "width" : "height", config[__axis_rotated] ? $$.width2 : $$.height2); |
|
|
|
// ATTENTION: This must be called AFTER chart added |
|
// Add Axis |
|
$$.axes.subx = context.append("g") |
|
.attr("class", CLASS[_axisX]) |
|
.attr("transform", $$.getTranslate('subx')) |
|
.attr("clip-path", config[__axis_rotated] ? "" : $$.clipPathForXAxis); |
|
}; |
|
c3_chart_internal_fn.updateTargetsForSubchart = function (targets) { |
|
var $$ = this, context = $$.context, config = $$.config, |
|
contextLineEnter, contextLineUpdate, contextBarEnter, contextBarUpdate; |
|
|
|
if (config[__subchart_show]) { |
|
|
|
contextBarUpdate = context.select('.' + CLASS[_chartBars]).selectAll('.' + CLASS[_chartBar]) |
|
.data(targets) |
|
.attr('class', generateCall($$.classChartBar, $$)); |
|
contextBarEnter = contextBarUpdate.enter().append('g') |
|
.style('opacity', 0) |
|
.attr('class', generateCall($$.classChartBar, $$)); |
|
// Bars for each data |
|
contextBarEnter.append('g') |
|
.attr("class", generateCall($$.classBars, $$)); |
|
|
|
//-- Line --// |
|
contextLineUpdate = context.select('.' + CLASS[_chartLines]).selectAll('.' + CLASS[_chartLine]) |
|
.data(targets) |
|
.attr('class', generateCall($$.classChartLine, $$)); |
|
contextLineEnter = contextLineUpdate.enter().append('g') |
|
.style('opacity', 0) |
|
.attr('class', generateCall($$.classChartLine, $$)); |
|
// Lines for each data |
|
contextLineEnter.append("g") |
|
.attr("class", generateCall($$.classLines, $$)); |
|
// Area |
|
contextLineEnter.append("g") |
|
.attr("class", generateCall($$.classAreas, $$)); |
|
} |
|
}; |
|
c3_chart_internal_fn.redrawSubchart = function (withSubchart, transitions, duration, durationForExit, areaIndices, barIndices, lineIndices) { |
|
var $$ = this, d3 = $$.d3, context = $$.context, config = $$.config, |
|
contextLine, contextArea, contextBar, drawAreaOnSub, drawBarOnSub, drawLineOnSub; |
|
|
|
// subchart |
|
if (config[__subchart_show]) { |
|
// reflect main chart to extent on subchart if zoomed |
|
if (d3.event && d3.event.type === 'zoom') { |
|
$$.brush.extent($$.x.orgDomain()).update(); |
|
} |
|
// update subchart elements if needed |
|
if (withSubchart) { |
|
|
|
// rotate tick text if needed |
|
if (!config[__axis_rotated] && config[__axis_x_tick_rotate]) { |
|
$$.rotateTickText($$.axes.subx, transitions.axisSubX, config[__axis_x_tick_rotate]); |
|
} |
|
|
|
// extent rect |
|
if (!$$.brush.empty()) { |
|
$$.brush.extent($$.x.orgDomain()).update(); |
|
} |
|
// setup drawer - MEMO: this must be called after axis updated |
|
drawAreaOnSub = $$.generateDrawArea(areaIndices, true); |
|
drawBarOnSub = $$.generateDrawBar(barIndices, true); |
|
drawLineOnSub = $$.generateDrawLine(lineIndices, true); |
|
// bars |
|
contextBar = context.selectAll('.' + CLASS[_bars]).selectAll('.' + CLASS[_bar]) |
|
.data(generateCall($$.barData, $$)); |
|
contextBar.enter().append('path') |
|
.attr("class", generateCall($$.classBar, $$)) |
|
.style("stroke", 'none') |
|
.style("fill", $$.color); |
|
contextBar |
|
.style("opacity", generateCall($$.initialOpacity, $$)) |
|
.transition().duration(duration) |
|
.attr('d', drawBarOnSub) |
|
.style('opacity', 1); |
|
contextBar.exit().transition().duration(duration) |
|
.style('opacity', 0) |
|
.remove(); |
|
// lines |
|
contextLine = context.selectAll('.' + CLASS[_lines]).selectAll('.' + CLASS[_line]) |
|
.data(generateCall($$.lineData, $$)); |
|
contextLine.enter().append('path') |
|
.attr('class', generateCall($$.classLine, $$)) |
|
.style('stroke', $$.color); |
|
contextLine |
|
.style("opacity", generateCall($$.initialOpacity, $$)) |
|
.transition().duration(duration) |
|
.attr("d", drawLineOnSub) |
|
.style('opacity', 1); |
|
contextLine.exit().transition().duration(duration) |
|
.style('opacity', 0) |
|
.remove(); |
|
// area |
|
contextArea = context.selectAll('.' + CLASS[_areas]).selectAll('.' + CLASS[_area]) |
|
.data(generateCall($$.lineData, $$)); |
|
contextArea.enter().append('path') |
|
.attr("class", generateCall($$.classArea, $$)) |
|
.style("fill", $$.color) |
|
.style("opacity", function () { $$.orgAreaOpacity = +d3.select(this).style('opacity'); return 0; }); |
|
contextArea |
|
.style("opacity", 0) |
|
.transition().duration(duration) |
|
.attr("d", drawAreaOnSub) |
|
.style("fill", $$.color) |
|
.style("opacity", $$.orgAreaOpacity); |
|
contextArea.exit().transition().duration(durationForExit) |
|
.style('opacity', 0) |
|
.remove(); |
|
} |
|
} |
|
}; |
|
c3_chart_internal_fn.redrawForBrush = function () { |
|
var $$ = this, x = $$.x; |
|
$$.redraw({ |
|
withTransition: false, |
|
withY: false, |
|
withSubchart: false, |
|
withUpdateXDomain: true |
|
}); |
|
$$.config[__subchart_onbrush].call($$.api, x.orgDomain()); |
|
}; |
|
c3_chart_internal_fn.transformContext = function (withTransition, transitions) { |
|
var $$ = this, subXAxis; |
|
if (transitions && transitions.axisSubX) { |
|
subXAxis = transitions.axisSubX; |
|
} else { |
|
subXAxis = $$.context.select('.' + CLASS[_axisX]); |
|
if (withTransition) { subXAxis = subXAxis.transition(); } |
|
} |
|
$$.context.attr("transform", $$.getTranslate('context')); |
|
subXAxis.attr("transform", $$.getTranslate('subx')); |
|
};
|
|
|