javascript - 根据json值生成表格单元格中的图表

标签 javascript plotly react-google-charts

我需要在每行的表格单元格中创建一个条形图或柱形图。
即我需要为表格单元格内的每个类别填充一个图表。
JSON:

[
  {
    "Chocolate": [
      {
        "kisses": [
          {
            "2022": {
              "jan": 2000,
              "feb": 1200,
              "mar": 7000
            }
          },
          {
            "2021": {
              "jan": 2000,
              "feb": 1200,
              "mar": 7000
            }
          }
        ]
      },
      {
        "kitkat": [
          {
            "2022": {
              "jan": 1000,
              "feb": 3200,
              "mar": 4500
            }
          },
          {
            "2021": {
              "jan": 2000,
              "feb": 200,
              "mar": 7030
            }
          }
        ]
      }
    ]
  },
  {
    "Drinks": [
      {
        "Coco cola": [
          {
            "2022": {
              "jan": 2000,
              "feb": 1200,
              "mar": 7000
            }
          },
          {
            "2021": {
              "jan": 2200,
              "feb": 1200,
              "mar": 7100
            }
          }
        ]
      },
      {
        "Pepsi": [
          {
            "2022": {
              "jan": 1000,
              "feb": 3200,
              "mar": 4500
            }
          },
          {
            "2021": {
              "jan": 4550,
              "feb": 2100,
              "mar": 3430
            }
          }
        ]
      }
    ]
  }
]
我需要在每行的表格单元格中创建一个条形图或柱形图。

google.charts.load('current', {
  packages: ['corechart', 'table']
}).then(function () {
  var data = new google.visualization.DataTable();
  data.addColumn('string', 'Category');
  data.addColumn('number', 'Name');
  data.addColumn('string', 'Chart');
  data.addRows([
    ['Choclate', {v: 10000, f: 'Kisses'}, null],
    ['Drinks', {v: 12500, f: 'Pepsi'}, null],
    ['Food', {v: 7000, f: 'Pizza'}, null]
  ]);

  var table = new google.visualization.Table(document.getElementById('table_div'));

  google.visualization.events.addListener(table, 'ready', function () {
    // table body
    Array.prototype.forEach.call(table.getContainer().getElementsByTagName('tbody'), function(tableBody) {
      // table rows
      Array.prototype.forEach.call(tableBody.rows, function(tableRow, rowIndex) {
        // table cells
        Array.prototype.forEach.call(tableRow.cells, function(tableCell, cellIndex) {
          // determine if last cell
          if (cellIndex === (tableRow.cells.length - 1)) {
            // add chart continer
            var chartContainer = tableCell.appendChild(document.createElement('div'));
            chartContainer.className = 'chart';

            // build chart data table
            var dataChart = new google.visualization.DataTable();
            dataChart.addColumn('number', 'x');
            dataChart.addColumn('number', 'y');
            for (var i = 0; i <= rowIndex; i++) {
              dataChart.addRow([i, data.getValue(i, 1)]);
            }

            // draw chart
            var chart = new google.visualization.ColumnChart(chartContainer);
            chart.draw(dataChart, {
              chartArea: {
                left: 24,
                top: 16,
                right: 24,
                bottom: 16,
                height: '100%',
                width: '100%'
              },
              height: '100%',
              legend: 'none',
              pointSize: 6,
              width: '100%'
            });
          }
        });
      });
    });
  });

  table.draw(data, {showRowNumber: true, width: '60%', height: '70%'});
});
<script src="https://www.gstatic.com/charts/loader.js"></script>
<div id="table_div"></div>

我希望将 JSON 值填充到每个类别的图表中。
样本输出:
/image/H973g.png
如果无法根据类别旋转行。我需要尝试每行。
请建议我如何实现

最佳答案

您可以尝试以下方法。

  • 您需要根据行准备 JSON。
    所以你需要像下面这样转换你的数据processData var 将包含适当的数据集。
  • 在每一行之后,您需要根据类别合并单元格。我引用了 this SO
  • 在图表中,添加每年的数据并按月求和

  • let chartData = [{
        "Chocolate": [{
            "kisses": [{
                "2022": {
                  "jan": 2000,
                  "feb": 1200,
                  "mar": 7000
                }
              },
              {
                "2021": {
                  "jan": 2000,
                  "feb": 1200,
                  "mar": 7000
                }
              }
            ]
          },
          {
            "kitkat": [{
                "2022": {
                  "jan": 1000,
                  "feb": 3200,
                  "mar": 4500
                }
              },
              {
                "2021": {
                  "jan": 2000,
                  "feb": 200,
                  "mar": 7030
                }
              }
            ]
          }
        ]
      },
      {
        "Drinks": [{
            "Coco cola": [{
                "2022": {
                  "jan": 2000,
                  "feb": 1200,
                  "mar": 7000
                }
              },
              {
                "2021": {
                  "jan": 2200,
                  "feb": 1200,
                  "mar": 7100
                }
              }
            ]
          },
          {
            "Pepsi": [{
                "2022": {
                  "jan": 1000,
                  "feb": 3200,
                  "mar": 4500
                }
              },
              {
                "2021": {
                  "jan": 4550,
                  "feb": 2100,
                  "mar": 3430
                }
              }
            ]
          }
        ]
      }
    ];
    
    
    const processData = chartData.reduce((prev, next) => {
      let category = Object.keys(next)[0];
      next[category].forEach(value => {
        let key = Object.keys(value)[0]
        let data = [category, key, null, value[key]];
        prev.push(data);
      })
      return prev;
    }, []);
    
    const rowsData = [];
    processData.forEach(row => {
      rowsData.push(row.slice(0, -1));
    })
    
    google.charts.load('current', {
      packages: ['corechart', 'table']
    }).then(function() {
      var data = new google.visualization.DataTable();
      data.addColumn('string', 'Category');
      data.addColumn('string', 'Name');
      data.addColumn('string', 'Chart');
      data.addRows(rowsData)
    
      var table = new google.visualization.Table(document.getElementById('table_div'));
    
      google.visualization.events.addListener(table, 'ready', function() {
        // table body
        Array.prototype.forEach.call(table.getContainer().getElementsByTagName('tbody'), function(tableBody) {
          // table rows
          var rowLabel = null;
          var rowIndex;
          var rowSpan;
          Array.prototype.forEach.call(tableBody.rows, function(tableRow, rowIndex) {
            // table cells
    
            if (rowLabel !== tableRow.cells[0].innerHTML) {
              rowLabel = tableRow.cells[0].innerHTML;
              rowIndex = rowIndex;
              if (rowSpan > 1) {
                tableBody.rows[rowIndex - rowSpan].cells[0].rowSpan = rowSpan;
              }
              rowSpan = 1;
            } else {
              tableRow.removeChild(tableRow.cells[0]);
              if (rowIndex === (tableBody.rows.length - 1)) {
                tableBody.rows[rowIndex - rowSpan].cells[0].rowSpan = ++rowSpan;
              } else {
                rowSpan++;
              }
            }
    
    
            Array.prototype.forEach.call(tableRow.cells, function(tableCell, cellIndex) {
    
    
              // determine if last cell
              if (cellIndex === (tableRow.cells.length - 1)) {
                // add chart continer
                var chartContainer = tableCell.appendChild(document.createElement('div'));
                chartContainer.className = 'chart';
    
                // build chart data table
                var dataChart = new google.visualization.DataTable();
                dataChart.addColumn('string', 'x');
                dataChart.addColumn('number', 'y');
                const row = processData[rowIndex];
    
                row[3].forEach(value => {
    
                  const key = Object.keys(value)[0];
                  let sum = 0;
                  Object.keys(value[key]).forEach(month => {
                    sum += value[key][month]
                  })
                  dataChart.addRow([key, sum]);
                })
    
                // draw chart
                var chart = new google.visualization.ColumnChart(chartContainer);
                chart.draw(dataChart, {
                  chartArea: {
                    left: 24,
                    top: 16,
                    right: 24,
                    bottom: 16,
                    height: '100%',
                    width: '100%'
                  },
    
                  legend: 'none',
                  pointSize: 6,
                  width: '150'
                });
              }
            });
          });
        });
      });
    
      table.draw(data, {
        width: '60%',
        height: '70%'
      });
    });
    <script src="https://www.gstatic.com/charts/loader.js"></script>
    <div id="table_div"></div>

    关于javascript - 根据json值生成表格单元格中的图表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71959554/

    相关文章:

    javascript - jQuery 查找返回空字符串

    javascript - Bootstrap 3.0 弹出窗口和工具提示

    r - 如何在换行悬停标签上添加换行符

    python - 如何使用 Plotly Express 和 Plotly 隐藏图例

    javascript - JS中大数算术运算如何得到精确的整数结果?

    javascript - 如何从父级调用 iframe 中的 func?

    R - 隐藏的线条

    javascript - 如何制作react-google图表双y轴

    javascript - 谷歌图表呈现空图表添加行()错误