【问题标题】:part 2 - how to group duplicate labels in order to create a label without duplicates in chart.js第 2 部分 - 如何对重复标签进行分组以便在 chart.js 中创建没有重复的标签
【发布时间】:2021-07-08 11:02:42
【问题描述】:

这是这个问题的延续Part - 1 但是问题出在数据变化的事实,当然我已经尝试过修改格式json但是由于我使用pandas来获取这种格式json,所以修改数据框格式不会很pythonic

<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.6.0/Chart.min.js"></script>
<div class="trendmensuel">
    <canvas id="trendmensuel"></canvas>
</div>

<script>
       var trendMensuel = [ 
  { produit: "HOME40Z", mois: "Janvier", effectif: 6, bgColor: "red" },
  { produit: "HOME60", mois: "Janvier", effectif: 7, bgColor: "green" },

  { produit: "HOME40Z", mois: "Février", effectif: 6, bgColor: "red" },
  { produit: "PRO", mois: "Fevrier", effectif: 9, bgColor: "blue" },

  { produit: "HOME60", mois: "Mars", effectif: 3, bgColor: "green" },
];


   var label_trendMensuel = trendMensuel.map(function(e){
    return e.mois;
   });

   var produit_trendMensuel = trendMensuel.map(function(e){
    return e.produit;
   });

   var effectif_trendMensuel = trendMensuel.map(function(e){
    return e.effectif;
   });;

var ctx = document.getElementById("trendmensuel");
var chart = new Chart(ctx, {
   type :"bar",
   data : {
     labels : label_trendMensuel, // ito efa mety
     datasets:[
     {
        type: "bar",
        backgroundColor: "rgba(54, 162, 235, 0.2)",
        borderColor: "rgba(54, 162, 235, 1)",
        borderWidth: 1,
        label: produit_trendMensuel,
        data: effectif_trendMensuel,
     },],
   },

   });

</script>

【问题讨论】:

    标签: javascript charts chart.js


    【解决方案1】:

    您可以获取一个Month数组并根据Month Array中的索引追加数据集数据。

    以下示例

    var trendMensuel = [
      { produit: "HOME40Z", mois: "Janvier", effectif: 1, bgColor: "red" },
      { produit: "HOME60", mois: "Janvier", effectif: 2, bgColor: "green" },
    
      { produit: "HOME40Z", mois: "Février", effectif: 3, bgColor: "red" },
      { produit: "PRO", mois: "Février", effectif: 4, bgColor: "blue" },
    
      { produit: "HOME60", mois: "Mars", effectif: 5, bgColor: "green" },
    ];
    
    const months = trendMensuel.reduce((a, b) => {
      const i = a.findIndex(x => x === b.mois);
      if (i === -1) {
        a.push(b.mois);
      }
      return a;
    }, []);
    
    const lenOfMonth = months.length;
    
    const products = trendMensuel.reduce((a, b) => {
      const i = months.findIndex(y => y === b.mois);
      const j = a.findIndex(y => y.label === b.produit);
    
      if (j === -1) {
        const obj = {
          type: "bar",
          backgroundColor: b.bgColor,
          borderColor: "rgba(54, 162, 235, 1)",
          borderWidth: 1,
          label: b.produit,
          data: new Array(lenOfMonth).fill(0),
        };
        obj.data[i] = b.effectif;
        a.push(obj);
      } else {
        a[j].data[i] = b.effectif;
      }
    
      return a;
    }, []);
    
    var ctx = document.getElementById("trendmensuel").getContext("2d");
    var chart = new Chart(ctx, {
      type: "bar",
      data: {
        labels: months, // ito efa mety
        datasets: products,
      },
    });
    <script src="https://cdn.jsdelivr.net/npm/chart.js@3.4.1/dist/chart.min.js"></script>
    <canvas id="trendmensuel" width="400" height="400"></canvas>

    【讨论】:

    • 在这个领域仍然很新,我想我需要很长时间才能理解这段代码,但幸运的是,这个结果可以肯定它可以工作:) 另外它是动态代码,它真的不占空间!非常感谢您抽出宝贵的时间提供这个精彩的代码!我还有最后一个问题,比如说受限
    • @SarindraTherese,不客气。如果您对代码有疑问,可以问我。你可以尝试console.log(months)console.log(products)看看里面有什么商店,我想这可能有助于你了解更多。
    • 所以这里是:如果我得到另一个值列,如“有效”列,但命名为例如百分比?比方说数据是多维表的chart js怎么画图?也许我必须为此提出另一个问题?我已经从这个链接jsfiddle.net/z8k0uwjL/4 中获得灵感,已经设法做到了,但这不是动态的
    • @SarindraTherese,我不确定你想说什么。我认为您应该就此提出另一个问题。让更多人看到你。此外,您可以在问题中使用 Stackoverflow Code sn-ps。就像我回答你问题的方式一样。 meta.stackoverflow.com/a/356679/14032355
    猜你喜欢
    • 2021-09-17
    • 2019-10-17
    • 1970-01-01
    • 2014-07-10
    • 2016-05-14
    • 1970-01-01
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多