叠加条形图与重叠条C3js

时间:2015-12-06 19:39:20

标签: javascript html css d3.js c3.js

美好的一天。

我正在尝试使用如下所示的C3.js创建条形图:

Image showing result chart bar

我已经尝试了堆叠条形图,但问题是我不能使每个条形图具有不同的宽度,而且我也不能使它们重叠(在彼此的顶部)。

如上图所示,有什么帮助吗?

谢谢

更新1:

在尝试了几个想法之后,我最终得到了这个:

var chart = c3.generate({
data: {
    columns: [
      ['result1', null],
      ['result2', null],
      ['data1', -30],
      ['data2', -130],
      ['data3', -230],
      ['data4', -130],
      ['data5', -30],
      ['empty',''],
      ['data11', -30],
      ['data22', -130],
      ['data33', -230],
      ['data44', -130],
      ['data55', -30]
    ],

    type: 'bar',

    colors: {
      result1: '#c3c8d4',
      data1: '#c3c8d4',
      data2: '#c3c8d4',
      data3: '#c3c8d4',
      data4: '#c3c8d4',
      data5: '#c3c8d4',

      result2: '#3c9fbf',
      data11: '#3c9fbf',
      data22: '#3c9fbf',
      data33: '#3c9fbf',
      data44: '#3c9fbf',
      data55: '#3c9fbf',
    },
},
axis: {
    y: {
      tick: {
        format: function(d) {
          return (d >= 0) ? d : d * -1;
        }
      },
    }
},
bar: {
    width: {
      ratio: 0.1
    }
},
tooltip: {
    format: {
      value: function(value, ratio, id) {
        return;
      }
    }
}
});


d3.select('.c3-legend-item-result1').on('mouseover', function(id) {
    var tmparr = [];
    tmparr.push(id);
    for (var i = 0; i < 5; i++)
        tmparr.push('data' + (i + 1));
    chart.focus(tmparr);
  })
  .on('mouseout', function(id) {
    chart.revert();
  })
  .on('click', function(id) {
    var tmparr = [];
    for (var i = 0; i < 5; i++)
        tmparr.push('data' + (i + 1));
    chart.toggle(tmparr);
  });

d3.select('.c3-legend-item-result2').on('mouseover', function(id) {
    var tmparr = [];
    tmparr.push(id);
    for (var i = 0; i < 5; i++)
        tmparr.push('data' + (i + 1) + (i + 1));
    chart.focus(tmparr);
  })
  .on('mouseout', function(id) {
    chart.revert();
  })
  .on('click', function(id) {
    var tmparr = [];
    for (var i = 0; i < 5; i++)
        tmparr.push('data' + (i + 1) + (i + 1));
    chart.toggle(tmparr);
  });

JSFiddle:http://jsfiddle.net/h2ndL9cb/

但我认为代码太多,其他任何想法都没有?

由于

1 个答案:

答案 0 :(得分:1)

您可以定义图表数据(见下文)。获得数据后,您可以转换和隐藏图例项。

可以使用诸如lodash之类的库与c3js对象合并转换后的数据。

当然,这并不能完全解决您的问题,但这可以让您了解如何转换数据以获得所需的结果。

&#13;
&#13;
var chartData = {
  data : {
    result1: [-30, -130, -230, -130, -30],
    result2: [-30, -130, -230, -130, -30]
  },
  colors: {
    result1: '#c3c8d4',
    result2: '#3c9fbf'
  },
};

function transformData(data) {
  var data_columns = [];
  var data_colors = {};
  var legend_hide = ['empty'];
  var keys = Object.keys(data.data);

  for (var k = 0; k < keys.length; k++) {
    var key = keys[k];
    var values = data.data[key];

    data_columns.splice(k, 0, [key, null]);
    data_colors[key] = data.colors[key];

    for (var i = 0; i < values.length; i++) {
      var value_key = key + '_' + k + '_' + i

      data_columns.push([value_key, values[i]]);
      data_colors[value_key] = data.colors[key];
      legend_hide.push(value_key);
    }
    if (k < keys.length - 1) {
      data_columns.push(['empty', '']);
    }
  }

  return {
    data : {
      columns : data_columns,
      colors : data_colors
    },
    legend : {
      hide : legend_hide
    }
  };
}

var chart = c3.generate(_.merge({
  data : {
    type : 'bar'
  },
  axis: {
    y: {
      tick: {
        format: function(d) {
          return (d >= 0) ? d : d * -1;
        }
      },
    }
  },
  bar: {
    width: {
      ratio: 0.1
    }
  },
  tooltip: {
    format: {
      value: function(value, ratio, id) {
        return;
      }
    }
  }
}, transformData(chartData))); // Transform and merge data...
&#13;
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/c3/0.4.10/c3.min.css">

<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.10/d3.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/c3/0.4.10/c3.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.min.js"></script>

<div id="chart"></div>
&#13;
&#13;
&#13;