代码之家  ›  专栏  ›  技术社区  ›  vw88

当每个单独的段都是一个对象时,如何在d3中创建堆积条形图?

  •  0
  • vw88  · 技术社区  · 6 年前

    我正试图在d3中创建一个图表,因此它看起来是这样的: https://ibb.co/j13i5T

    数据格式如下,不能更改:

      var data = [
      {
      "year": "1991",
      "color":"purple",
      "value":12,
      },
      {
      "year":"1991",
      "color":"red",
      "value":8,
      },
      {
      "year": "1992",
      "color":"red",
      "value":20,
      },
      {
      "year": "1993",
      "color":"blue",
      "value":9,
      },
      {
      "year": "1993",
      "color":"red",
      "value":7,
      },
      {
      "year": "1993",
      "color":"purple",
      "value":3,
      },
    ]
    

    我已经能够让每一个对象在相应的年份被放置,但我正在努力堆叠它们。

    这是代码,尽管它在本地显示在我的计算机上,但我并没有让它在小提琴中工作: https://jsfiddle.net/joat1/kug91hm0/34/

    如果有更好的方法来处理事情的整体以及,我绝对开放的意见。

    1 回复  |  直到 6 年前
        1
  •  1
  •   jsanderlin    6 年前

    如上所述,我的首选解决方案是 ChartJS 对于这类项目。我继续做了一个简单的数据转换,将输入的数据映射成chartjs可以读取的格式,然后快速地尝试重新创建示例图表。

    密码笔在这里 https://codepen.io/jsanderlin/pen/dKqEod

    我将看看下面为chartjs执行数据映射/预处理的代码,因为这是这个过程中最复杂的javascript代码。剩下的js/html只是从chartjs文档和堆叠的图表示例中提取出来的 here 是的。

    data.forEach((val) => {
      // Add the label if it doesn't exist already
      if(!barChartData.labels.includes(val.year)) {
        barChartData.labels.push(val.year);
      }
    
      // Search for the correct dataset
      let valsDataset;
      let datasetName = `Dataset ${val.color}`;
      barChartData.datasets.forEach((dataset) => {
        if(dataset.label === datasetName) valsDataset = dataset;
      });
    
      // Add the dataset if it doesn't exist already
      if(valsDataset === undefined) {
        valsDataset = {
          label: datasetName,
          backgroundColor: val.color,
          data: []
        }
        barChartData.datasets.push(valsDataset);
      }
    
      // Find the correct index of the data array for this value, by looking up the year
      let valIndex = barChartData.labels.indexOf(val.year);
      // Set the correct data attribute according to val.value
      valsDataset.data[valIndex] = val.value;
    });
    

    今天下午要做的有趣的项目;)