【问题标题】:Error: Data column(s) for axis #0 cannot be of type string错误:轴 #0 的数据列不能是字符串类型
【发布时间】:2020-08-25 09:38:59
【问题描述】:

我正在尝试使用谷歌图表和 React/JS 创建散点图。我制作了一个测试数组来检查它是否是将数据发送到图表的正确方法并且它有效。但是当我处理真实数据并创建一个类似的数组时,它得到了错误:“轴 #0 的数据列不能是字符串类型”。

这是正常工作的测试数组:

       let dataTest = [
        ['Día', 'Enfado', 'Irritabilidad','Dolor', 'Ansiedad'],
              ['1',  null, 10, 20, 30],
              ['2', 30, 20, 10, null],
             
            ]   
 

这是真实的,这给了我错误:

[给我错误的真实数组][1]

如果您在 chrome 控制台上比较两者,它们具有相同的结构,所以我无法弄清楚为什么不起作用: [两个数组都打印在 chrome 控制台上][2]

提前非常感谢您! [1]:https://i.stack.imgur.com/3efGN.png [2]:https://i.stack.imgur.com/hHzar.png

【问题讨论】:

    标签: javascript reactjs charts google-visualization


    【解决方案1】:

    错误表明 y 轴的列不能是字符串类型。

    错误是使用静态方法引起的 --> arrayToDataTable

    arrayToDataTable 试图猜测传递给该方法的数据类型。
    如果无法确定类型,则默认为字符串。

    在“真实”数组的例子中,只有一行数据。
    它必须使用的唯一值是null
    所以无法正确判断类型,默认为字符串。

    你可以在下面的工作 sn-p 中看到这个结果...

    google.charts.load('current', {
      packages:['corechart']
    }).then(function () {
      var jsonData = [
        ['Día', 'Enfado', 'Irritabilidad','Dolor', 'Ansiedad', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p'],
        ['28',  null,  null,  null,  null,  null,  null,  null,  null,  null,  null,  null,  null,  null,  null,  null,  null,  null,  180,  190,  null]
      ];
    
      var data = google.visualization.arrayToDataTable(jsonData);
    
      for (var i = 0; i < data.getNumberOfColumns(); i++) {
        console.log(i, data.getColumnType(i));
      }
    });
    &lt;script src="https://www.gstatic.com/charts/loader.js"&gt;&lt;/script&gt;

    相反,您需要手动构建数据表,
    为每列设置特定的列类型。

    var data = new google.visualization.DataTable();
    data.addColumn('string', 'Día');            // <-- x-axis - string
    data.addColumn('number', 'Enfado');         // <-- y-axis - number
    data.addColumn('number', 'Irritabilidad');  // <-- y-axis - number
    ...
    

    但我们可以动态构建数据表,
    基于收到的json数据。

    var jsonData = [
      ['Día', 'Enfado', 'Irritabilidad','Dolor', 'Ansiedad', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p'],
      ['28',  null,  null,  null,  null,  null,  null,  null,  null,  null,  null,  null,  null,  null,  null,  null,  null,  null,  180,  190,  null]
    ];
    
    var data = new google.visualization.DataTable();
    
    jsonData.forEach(function (row, indexRow) {
      if (indexRow === 0) {
        row.forEach(function (column, indexCol) {
          if (indexCol === 0) {
            data.addColumn('string', column);
          } else {
            data.addColumn('number', column);
          }
        });
      } else {
        data.addRow(row);
      }
    });
    

    请参阅以下工作 sn-p...

    google.charts.load('current', {
      packages:['corechart']
    }).then(function () {
      var jsonData = [
        ['Día', 'Enfado', 'Irritabilidad','Dolor', 'Ansiedad', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p'],
        ['28',  null,  null,  null,  null,  null,  null,  null,  null,  null,  null,  null,  null,  null,  null,  null,  null,  null,  180,  190,  null]
      ];
    
      var data = new google.visualization.DataTable();
    
      jsonData.forEach(function (row, indexRow) {
        if (indexRow === 0) {
          row.forEach(function (column, indexCol) {
            if (indexCol === 0) {
              data.addColumn('string', column);
            } else {
              data.addColumn('number', column);
            }
          });
        } else {
          data.addRow(row);
        }
      });
    
      var options = {
        chartArea: {
          left: 64,
          top: 48,
          right: 32,
          bottom: 64,
          height: '100%',
          width: '100%'
        },
        height: '100%',
        legend: {
          position: 'none'
        },
        width: '100%'
      };
    
      var chart = new google.visualization.ScatterChart(document.getElementById('chart'));
      chart.draw(data, options);
    });
    html, body {
      height: 100%;
      margin: 0px 0px 0px 0px;
      overflow: hidden;
      padding: 0px 0px 0px 0px;
    }
    
    #chart {
      height: 100%;
      min-height: 400px;
    }
    <script src="https://www.gstatic.com/charts/loader.js"></script>
    <div id="chart"></div>

    【讨论】:

    • official docs page 中的示例没有说明这一点。它应该只使用字符串列名。
    猜你喜欢
    • 2022-01-12
    • 1970-01-01
    • 2014-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-21
    • 2021-12-20
    • 1970-01-01
    相关资源
    最近更新 更多