Проблема с Google-диаграммами и ролью аннотации: true, динамический режим не работает с использованием dataview - PullRequest
0 голосов
/ 11 июня 2018

Как добавить метки в каждый столбец, используя аннотации true снаружи, поскольку add динамически получает цену для каждого столбца.

Я хочу использовать метку для каждого столбца как цену со знаком $.Я пытаюсь использовать представление данных, но получаю статический способ, используя представление данных.

Как я могу это сделать, если вы можете предложить мне какой-нибудь намек или реализовать динамический способ?

google.charts.load('current', {
  packages: ['corechart']
  }).then(function () {
  var charts = {};
  var options = {
    Column: {
      chartArea: {
        height: '100%',
        width: '100%',
        top: 24,
        left: 64,
        right: 32,
        bottom: 48,
      },
      'vAxis': { 
        title: 'Cost in USD ($)', format:'$#',
      },
      height: '100%',
      legend: {
        position: 'bottom'
      },
      width: '100%'
    }
    };
  //  columns charts data
var jsonData = [["product1",450],["product2",23],["product3",1008.0],["product4",1008.0],["product",108.0],["product7",1008.0],["product4",10.0],["product6",10.0],["product9",10.0],["product5",108.0],["product10",1.0]];
  loadData(jsonData, '1', 'Column');
  
  // load json data
  function loadData(jsonData, id, chartType) {
    // create data table
    var dataTable = new google.visualization.DataTable();
  
       // add date column
       dataTable.addColumn('string', 'Category');
       var rowIndex = dataTable.addRow();
       dataTable.setValue(rowIndex, 0, dataTable.getColumnLabel(0));
       $.each(jsonData, function(productIndex, product) {
        var colIndex = dataTable.addColumn('number', product[0]);
          // add product data
          dataTable.setValue(rowIndex, colIndex, product[1]);
        });
         // draw chart
    $(window).resize(function () {
      drawChart(id, dataTable);
    });
    drawChart(id, dataTable);
  }
  
  
   
   
    function getDataView(dataTable) {
    var dataView;
    var viewColumns = [];

    for (var i = 0; i < dataTable.getNumberOfColumns(); i++) {
      addViewColumn(i);
    }

    function addViewColumn(index) {
      viewColumns.push(index);
      if (index > 0) {
        viewColumns.push({
           calc: function (dt, row) {
           return dt.getFormattedValue(row, index) ;
          },
           sourceColumn: index,
             type: 'string',
             role: 'annotation'
        });
      }
    }

    dataView = new google.visualization.DataView(dataTable);
    dataView.setColumns(viewColumns);
    return dataView;
  }
  

 
  var formatter = new google.visualization.NumberFormat(
    {prefix: '$'});
  formatter.format(dataTable);
  // draw chart
 function drawChart(id, dataTable) {
  
    if (!charts.hasOwnProperty(id)) {
     
      charts[id] = new google.visualization.ChartWrapper({
        chartType: 'Column' + 'Chart',
        containerId: 'chart-' + id,
        options:  {
        'vAxis': { 
          title: 'Cost in USD ($)', format:'$#',
        }, 
         width: '100%',
         height: '100%',
         legend: {
        position: 'bottom'
      },
    },
      });
    }
   var view = getDataView(dataTable);
    charts[id].setDataTable(view);
    charts[id].draw(view.toDataTable(),options);
  }
});
html, body {
  height: 100%;
  margin: 0px 0px 0px 0px;
  overflow: hidden;
  padding: 0px 0px 0px 0px;
}

.chart {
  height: 100%;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://www.gstatic.com/charts/loader.js"></script>
<div class="chart" id="chart-1"></div>

1 Ответ

0 голосов
/ 11 июня 2018

используйте вид, чтобы нарисовать график

попробуйте изменить ...

charts[id].setDataTable(dataTable);

на ...

charts[id].setDataTable(view);

РЕДАКТИРОВАТЬ

, чтобы убедиться, что представление имеет доступ к таблице данных,
создать представление в функции drawChart ...

function drawChart(id, dataTable) {
  if (!charts.hasOwnProperty(id)) {
    charts[id] = new google.visualization.ChartWrapper({
      chartType: 'Column' + 'Chart',
      containerId: 'chart-' + id,
      options:  {
      'vAxis': { 
        title: 'Cost in USD ($)', format:'$#',
      }, 
       width: '100%',
       height: '100%',
       legend: {
          position: 'bottom'
        },
      },
    });
  }

  var view = new google.visualization.DataView(dataTable);
  view.setColumns([0,
    1,
    {
      calc: "stringify",
      sourceColumn: 1,
      type: "string",
      role: "annotation"
    },
    2,
    {
      calc: "stringify",
      sourceColumn: 2,
      type: "string",
      role: "annotation"
    },

  ]);

  charts[id].setDataTable(view);
  charts[id].draw(view, options);
}

EDIT 2

не нужно передавать аргументы в функцию draw при рисовании оболочки
, которая только для обычного графика

charts[id].draw(view.toDataTable(),options);

должна быть ...

charts[id].draw();

см. Следующий рабочий фрагмент ...

google.charts.load('current', {
  packages: ['corechart']
}).then(function () {
  var charts = {};
  var options = {
    Column: {
      chartArea: {
        height: '100%',
        width: '100%',
        top: 24,
        left: 64,
        right: 32,
        bottom: 48,
      },
      'vAxis': {
        title: 'Cost in USD ($)', format:'$#',
      },
      height: '100%',
      legend: {
        position: 'bottom'
      },
      width: '100%'
    }
    };
  //  columns charts data
  var jsonData = [["product1",450],["product2",23],["product3",1008.0],["product4",1008.0],["product",108.0],["product7",1008.0],["product4",10.0],["product6",10.0],["product9",10.0],["product5",108.0],["product10",1.0]];
  loadData(jsonData, '1', 'Column');

  // load json data
  function loadData(jsonData, id, chartType) {
    // create data table
    var dataTable = new google.visualization.DataTable();

       // add date column
       dataTable.addColumn('string', 'Category');
       var rowIndex = dataTable.addRow();
       dataTable.setValue(rowIndex, 0, dataTable.getColumnLabel(0));
       $.each(jsonData, function(productIndex, product) {
        var colIndex = dataTable.addColumn('number', product[0]);
          // add product data
          dataTable.setValue(rowIndex, colIndex, product[1]);
        });
         // draw chart
    $(window).resize(function () {
      drawChart(id, dataTable);
    });
    drawChart(id, dataTable);
  }




    function getDataView(dataTable) {
    var dataView;
    var viewColumns = [];

    for (var i = 0; i < dataTable.getNumberOfColumns(); i++) {
      addViewColumn(i);
    }

    function addViewColumn(index) {
      viewColumns.push(index);
      if (index > 0) {
        viewColumns.push({
           calc: function (dt, row) {
           return dt.getFormattedValue(row, index) ;
          },
           sourceColumn: index,
             type: 'string',
             role: 'annotation'
        });
      }
    }

    dataView = new google.visualization.DataView(dataTable);
    dataView.setColumns(viewColumns);
    return dataView;
  }

  var formatter = new google.visualization.NumberFormat({prefix: '$'});
  formatter.format(dataTable);

  function drawChart(id, dataTable) {
    if (!charts.hasOwnProperty(id)) {
      charts[id] = new google.visualization.ChartWrapper({
        chartType: 'ColumnChart',
        containerId: 'chart-' + id,
        options:  {
          vAxis: {
            title: 'Cost in USD ($)',
            format: '$#',
          },
          width: '100%',
          height: '100%',
          legend: {
            position: 'bottom'
          },
        },
      });
    }
    var view = getDataView(dataTable);
    charts[id].setDataTable(view);
    charts[id].draw();
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://www.gstatic.com/charts/loader.js"></script>
<div id="chart-1"></div>
...