javascript - C3js堆叠条形图,每个条形部分有多个数据

标签 javascript bar-chart c3.js stacked-chart

我正在尝试创建一个堆叠条形图,其中一组中的每个条形部分都有两条数据,一个计数和一个成本。我希望计数反射(reflect)在条形中,我希望成本显示在条形标签中。

我还希望能够在工具提示中同时显示计数和成本。

这可能吗?最简单的方法是什么?

最佳答案

这是你可能想要的:

var matrix = [
  {//cat1 - position 0
    Low: {  cost: 10, count: 2},
    Medium: {  cost: 100, count: 20},
     High: {  cost: 1000, count: 40}
  },
  {//cat2 - position 1
    Low: {  cost: 20, count: 4},
    Medium: {  cost: 200, count: 40},
     High: {  cost: 2000, count: 60}
  },
   {//cat3 - position 2
    Low: {  cost: 30, count: 6},
    Medium: {  cost: 300, count: 60},
     High: {  cost: 3000, count: 80}
  }];
//countsData can be build using matrix
var countsData = [
            ['Low', 2, 4, 6],
            ['Medium', 20, 40, 60],
            ['High', 40, 60, 80],
        ];

var riskToColor = {
            Low: '#9ACD32',
            Medium: '#FFD700',
            High: '#FF4500'
        };
var categoriesList = ['cat1', 'cat2', 'cat3'];

var chart = c3.generate({
  bindto: '#cool-chart',
  size: {
    height: 200
    },
    data: {
        columns: countsData,
        type: 'bar',
        colors: riskToColor,
        groups: [
            ['Low', 'Medium', 'High']
        ],
       order: null,
       labels: {                       
         format: function (v, id, i, j) {
           if(i !== undefined) {
             // console.log(i+" " + matrix[i][id]['cost']); 
             return matrix[i][id]['cost'] + "$";
           } 
           else return v;
         }},
      },
      axis: {
         rotated: true,
         x: {
          type: 'category',
          categories: categoriesList
         },
        y: {show: false}
       },
      tooltip: {
        contents: function (d) {
          var $$ = this, config = $$.config,text;
          console.log(d[0]);
          text = "<table class='" + $$.CLASS.tooltip + "'><tr><th colspan='3'>"+categoriesList[d[0].index]+"</th></tr>"; 
          text += "<tr class='" + $$.CLASS.tooltipName + "'>";
          text += "<td class='name'>Risk</td>";
          text += "<td class='name'>Count</td>";
          text += "<td class='value'>Cost</td></tr>";
          for (i = 0; i < d.length; i++) {
            text += "<tr class='" + $$.CLASS.tooltipName + "'>";
            text += "<td class='name'><span style='background-color:"+riskToColor[d[i].name]+"'></span>"+d[i].name+"</td>";
            text += "<td class='value'>"+d[i].value+"</td>";
            text += "<td class='value'>"+matrix[d[i].x][d[i].name]['cost']+"$</td></tr>";
           }
          return text + "</table>";
        }
     }
});

Codepen 链接 https://codepen.io/georgebuzoianu/pen/djoMKR

您必须构建一个额外的结构来保存整个矩阵(类别成本计数)。使用该矩阵,您将能够为每个计数数据添加相应的成本标签。

关于javascript - C3js堆叠条形图,每个条形部分有多个数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51289137/

相关文章:

javascript - 需要为 c3 子图表设置背景颜色或使其不如主图表透明

javascript - 使用C3创建折线图

javascript - Kindle Fire 中的 Webview 浏览器

java - 如何在网页上执行随机 Javascript 代码?

javascript - 移动导航在滚动时消失

R绘图条形图正/负值不同颜色第二轴

javascript - D3.js 焦点 + 上下文溢出

javascript - .map 在未启动的数组上无法按预期工作

r - 如何计算列中每个类别的份额?

javascript - 在列标签和 x 轴标签之间添加空格 c3 图表