web-dev-qa-db-ja.com

Googleチャートダッシュボードでは、軸#0のデータ列を文字列型にすることはできません

私はグーグルチャートダッシュボードを作ろうとしています、そして次のコードを試しました:

_<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
    <title>
      Google Visualization API Sample
    </title>
    <script type="text/javascript" src="//www.google.com/jsapi"></script>
    <script type="text/javascript">
      google.load('visualization', '1.1', {packages: ['controls']});
    </script>


    <script type="text/javascript">

      function drawVisualization() {
          var listOfValues = document.getElementById("id1").value ;

          var temp2 = null;
          var temp3 = null ;
          var longArray = ['Year','Positive','Negative','Neutral','Comments','Status','Score'];
          var shortArrays = [], m, len;
          var arrayOfArray = [];

            var temp = listOfValues.split("-");
            for(var i=0; i<temp.length; i++){
                 temp2 = temp[i].split(',');

                if(temp2.length == 7){
                    for(var j=0; j<temp2.length;j++){
                     temp3 = temp2[j].split(',');
                     longArray.Push(temp3[0]);
                }
                }
            }

            for (m = 0, len = longArray.length; m < len; m += 7) {
                shortArrays.Push(longArray.slice(m, m + 7));
                console.log(shortArrays);
            }

            for (m = 0, len = shortArrays.length; m < len; m++) {
               arrayOfArray.Push(shortArrays[m]);
            }



        // Prepare the data
         var data = google.visualization.arrayToDataTable(arrayOfArray); 



        // Define a category picker control for the Gender column
        var categoryPicker = new google.visualization.ControlWrapper({
          'controlType': 'CategoryFilter',
          'containerId': 'control2',
          'options': {
            'filterColumnLabel': 'Year',
            'ui': {
            'labelStacking': 'vertical',
              'allowTyping': false,
              'allowMultiple': true
            }
          }
        });

        // Define a category picker control for the Gender column
        var categoryPicker2 = new google.visualization.ControlWrapper({
          'controlType': 'CategoryFilter',
          'containerId': 'categoryPick2',
          'options': {
            'filterColumnLabel': 'Status',
            'ui': {
            'labelStacking': 'vertical',
              'allowTyping': false,
              'allowMultiple': true
            }
          }
        });



        //Define a combo chart
        var combo = new google.visualization.ChartWrapper({
            'chartType':'ComboChart',
            'containerId':'chart2',
              'options': {
                      'title' : 'Sentiment Analysis',
                      // setting the "isStacked" option to true fixes the spacing problem
                      'isStacked': false,
                      'height': 300,
                      'width': 300,
                      'vAxis': {title: "Sentiment"},
                      'hAxis': {title: "Month"},
                      'seriesType': "bars",
                      'series': {5: {type: "line"}}
                    },
                   // 'view': {'columns': [0, 1,2,3]}
                     'view': {
                        // set the columns to use in the chart's view
                        // calculated columns put data belonging to each country in the proper column
                        columns: [0,1,2,3] 
                     }



        });


        // Define a table
        var table = new google.visualization.ChartWrapper({
          'chartType': 'Table',
          'containerId': 'chart4',
          'options': {
              'view': {'columns': [1,2]},
            'width': '700px',
            'height':'100px'
          }
        });

        // Define a table
        var table2 = new google.visualization.ChartWrapper({
          'chartType': 'Table',
          'containerId': 'table2',
          'options': {
            'width': '200px'
          },
          'view': {'columns': [0,5]}
        });

      //Define a line chart
        var line = new google.visualization.ChartWrapper({
            'chartType':'LineChart',
            'containerId':'lineChart',
              'options': {
                 'label':'Sentiment Analysis'
                    },
                    'view': {'columns': [4,6]}

        });

        // Create a dashboard
       //   new google.visualization.Dashboard(document.getElementById('dashboard'));
        new google.visualization.Dashboard(document.getElementById('dashboard')).
            // Establish bindings, declaring the both the slider and the category
            // picker will drive both charts.
              bind([categoryPicker2], [line,table2]).

            bind([categoryPicker], [combo,table]).


            // Draw the entire dashboard.

            draw(data);
       //draw(data2);

   google.setOnLoadCallback(drawVisualization);


    </script>
  </head>


  <body style="font-family: Arial;border: 0 none;">
    <div id="dashboard">
      <table>
        <tr style='vertical-align: top'>
          <td style='width: 300px; font-size: 0.9em;'>
            <div id="control1"></div>
            <div id="control2"></div>
            <div id="control3"></div>
            <div id="categoryPick2"></div>
          </td>
          <td style='width: 600px'>
            <div style="float: left;" id="chart1"></div>
            <div style="float: left;" id="chart2"></div>
            <div style="float: right;" id="chart3"></div>
            <div style="float: right;" id="chart4"></div>
             <div style="float: right;" id="lineChart"></div>
              <div style="float: right;" id="table2"></div>
                     </td>
        </tr>
      </table>
      <input type="hidden"  id="id1" value=" ${listVal}" />
         <input type="hidden"  id="id2" value=" ${header1}" />
    </div>
   <div id="chart_div2" ></div>
  </body>

</html>
_

このコードを実行すると、テーブルデータが明確に表示されます。しかし、それはチャートを適切に表示しません(私はコンボチャートと折れ線チャートを使用しました)。次のエラーがスローされます。

"Data column(s) for axis #0 cannot be of type string"

誰かがこの問題の解決方法を教えてください。

ありがとう。

listOfValuesに警告すると、次の値が取得されます。

2010,84,65,45、facebook、bad、12345-2011,64,75,85、facebook、bad、2345-

基本的に、これらはデータベースの2行で、ハイフンで区切られています。詳細が必要な場合はお知らせください。

7
jane

グラフを描画するには、データ系列が「数値」タイプである必要があります(x軸データは「文字列」タイプにすることができます)。文字列を配列に分割しているため、配列要素はすべて文字列になります。すべてのデータが数値であると仮定すると、次の行を置き換えることができます。

longArray.Push(temp3[0]);

これとともに:

longArray.Push(parseFloat(temp3[0]));

または、データがすべて整数の場合:

longArray.Push(parseInt(temp3[0], 10));

[編集:さまざまなデータ型を処理するためのより完全な回答]

これに対処するには2つの方法があります。最初の方法は、列のデータ型を前もって定義することです。

var longArray = [
    {label: 'Year', type: 'number'},
    {label: 'Positive', type: 'number'},
    {label: 'Negative', type: 'number'},
    {label: 'Neutral', type: 'number'},
    {label: 'Comments', type: 'string'},
    {label: 'Status', type: 'string'},
    {label: 'Score', type: 'number'}
];

データを入力するときに、いくつかの大まかな型検出を行うこともできます。

for(var i=0; i<temp.length; i++){
    temp2 = temp[i].split(',');
    if(temp2.length == 7){
        for(var j=0; j<temp2.length;j++){
            // this does nothing except make temp2[j] into a 1-element array
            // temp3[0] === temp2[j], since you split on ',' already
            temp3 = temp2[j].split(',');
            if (temp3[0] == parseInt(temp3[0])) {
                longArray.Push(parseInt(temp3[0]));
            }
            else if (temp3[0] == parseFloat(temp3[0])) {
                longArray.Push(parseFloat(temp3[0]));
            }
            else {
                longArray.Push(temp3[0]);
            }
        }
    }
}

万が一に備えて、これら2つの方法を組み合わせることができます。彼らがここで働いているのを見てください: http://jsfiddle.net/asgallant/xLKcx/

余談ですが、私はコードをクリーンアップすることをお勧めします。データ配列を構築するセクションに多数のスパゲッティコードがあります。これがより簡単なバージョンです: http://jsfiddle.net/asgallant/xLKcx/1/

5
asgallant