| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- ;(function() {
- var extra = {}
- c3.chart.internal.fn.additionalConfig = {
- data_pairs: []
- }
- c3.chart.internal.fn.beforeInit = function(config) {
- var that = this
- // update internals only when chart type is "bubble"
- if (config.data.type !== 'bubble') {
- return
- }
- // Set extra to ba able to be used in other part
- this.extra = extra
- extra.getKey = function(x, y) {
- return x + '::' + y
- }
- this.config.data_type = 'scatter'
- this.config.axis_x_padding = 0
- this.config.axis_y_padding = 0
- this.config.axis_x_tick_centered = true
- this.config.axis_x_tick_format = function(d) {
- return extra.names[d]
- }
- this.config.axis_y_tick_format = function(d) {
- return extra.names[d]
- }
- if (!config.color || !config.color.pattern) {
- this.config.color_pattern = ['#1f77b4']
- }
- this.config.point_r = function(d) {
- var names = extra.names,
- values = extra.values,
- base_length = extra.base_length,
- x = names[d.x],
- y = d.id,
- key = extra.getKey(x, y),
- value = !values[key] ? 0 : values[key],
- max,
- max_r,
- max_area,
- a,
- area,
- r
- if (!base_length) {
- base_length = extra.base_length = d3.min([
- that.svg
- .select('.c3-axis.c3-axis-y path')
- .node()
- .getTotalLength(),
- that.svg
- .select('.c3-axis.c3-axis-x path')
- .node()
- .getTotalLength()
- ])
- }
- max = d3.max(
- Object.keys(values).map(function(key) {
- return values[key]
- })
- )
- max_r = base_length / (names.length * 2)
- max_area = max_r * max_r * Math.PI
- a = max_area / max
- area = value * a
- r = Math.sqrt(area / Math.PI)
- return r
- }
- this.config.point_sensitivity = 25
- this.config.point_focus_expand_enabled = false
- this.config.legend_show = false
- if (!config.tooltip || !config.tooltip.contents) {
- this.config.tooltip_contents = function(
- d,
- defaultTitleFormat,
- defaultValueFormat,
- color
- ) {
- var x = extra.names[d[0].x],
- y = d[0].name,
- v = extra.values[extra.getKey(x, y)],
- text
- text = "<table class='" + this.CLASS.tooltip + "'>"
- text += "<tr><th colspan='2'>" + x + ' / ' + y + '</th></tr>'
- text += "<tr><td class='value'>" + (!v ? 0 : v) + '</td></tr>'
- text += '</table>'
- return text
- }
- }
- // construct bubble chart data and setup config based on the values
- var xs = this.config.data_pairs.map(function(pair) {
- return pair.x
- }),
- ys = this.config.data_pairs.map(function(pair) {
- return pair.y
- })
- extra.names = d3
- .set(xs.concat(ys))
- .values()
- .sort()
- this.config.axis_y_tick_values = extra.names.map(function(name, i) {
- return i
- })
- var data_xs = {}
- extra.names.forEach(function(name) {
- data_xs[name] = name + '_x'
- })
- var data_columns_xs = Object.keys(data_xs).map(function(key) {
- return [data_xs[key]].concat(
- extra.names.map(function(name, i) {
- return i
- })
- )
- })
- var data_columns_values = extra.names.map(function(name, i) {
- return [name].concat(
- extra.names.map(function(name) {
- return i
- })
- )
- })
- this.config.data_xs = data_xs
- this.config.data_columns = data_columns_xs.concat(data_columns_values)
- var values = {}
- this.config.data_pairs.forEach(function(pair) {
- if (!pair.x || !pair.y) {
- throw 'x and y are required in data.'
- }
- values[extra.getKey(pair.x, pair.y)] = pair.value
- })
- extra.values = values
- this.config.axis_x_min = this.config.axis_y_min = -0.5
- this.config.axis_x_max = this.config.axis_y_max = extra.names.length - 0.5
- }
- })(window)
|