【问题标题】:tricky part of google charts Column with drill down functionality?具有向下钻取功能的谷歌图表列的棘手部分?
【发布时间】:2018-06-25 14:33:39
【问题描述】:

我正在创建谷歌图表,之后我已经实现了前 5 个用户柱形图,如果您选择第一个用户列而不是显示来自其他变量(每个用户数据)的第一个用户页面历史数据,它在高图表中的简单实现功能!但在谷歌图表中,我不知道在这个问题中添加 events.addListener 是否工作。让我知道谷歌图表在每列上提供点击事件,并在同一图表绘制功能中显示其他图表。 ?提前谢谢你

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
  //top 5 user data with total click 
  var jsonData = [["johan",69],["jack",23],["scott",24],["x",5],["y",10]];
  loadData(jsonData, '1', 'Column');
  //specifc user data 
   var user1 = [["report1",45],["report2",40],["index.html",50]];
   var user2 = [["report1",4],["report2",3],["index.html",5]];
   var user3 = [["report1",4],["report2",3],["index.html",5]];
   var user4 = [["report1",4],["report2",3],["index.html",5]];
   var user5 = [["report1",4],["report2",3],["index.html",5]];
 


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

       // add date column
       dataTable.addColumn('string', 'Total numbe of click');
       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 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'
          },
        },
      });
    }
     charts[id].setDataTable(dataTable);
    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>

【问题讨论】:

  • 谷歌图表是用画布还是 HTML 元素制作图表?如果它只是普通的 HTML 元素,您可以轻松地为该行/列的标签添加一个事件侦听器,但如果它是在画布中完成的,那么您将不得不做一些棘手的事情并跟踪它们的鼠标位置以确定它是否在该行/列的边界。
  • 它使用画布..这是专业...

标签: javascript jquery charts google-visualization


【解决方案1】:

要知道点击/选择了哪一列,
监听'select' 事件

google.visualization.events.addListener(chart, 'select', chartSelection);

然后使用图表方法getSelection()获取所选列的行列索引
getSelection会返回一个对象数组

[{row: 0, column: 1}]

选择和取消选择列时都会触发选择事件
一定要检查getSelection()返回的数组长度
在尝试访问数组内容之前

对于柱形图,一次只能选择一列
所以选择的值将始终是数组中的第一个元素

function chartSelection() {
  var selection = chart.getSelection();
  if (selection.length > 0) {
    var row = selection[0].row;
    var col = selection[0].column;
    var xValue = data.getValue(row, 0);
    var yValue = data.getValue(row, col);
    console.log('selection: ' + xValue + ' = ' + yValue);
  } else {
    console.log('nothing selected');
  }
}

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

google.charts.load('current', {
  packages: ['corechart']
}).then(function () {
  var data = google.visualization.arrayToDataTable([
    ['x', 'y0', 'y1'],
    ['A', 6, 7],
    ['B', 7, 9],
    ['C', 8, 11],
    ['D', 9, 11],
    ['E', 5, 6]
  ]);

  var options = {
    legend: {
      alignment: 'end',
      position: 'top'
    }
  };

  var container = document.getElementById('chart_div');
  var chart = new google.visualization.ColumnChart(container);

  google.visualization.events.addListener(chart, 'select', chartSelection);

  function chartSelection() {
    var selection = chart.getSelection();
    if (selection.length > 0) {
      var row = selection[0].row;
      var col = selection[0].column;
      var xValue = data.getValue(row, 0);
      var yValue = data.getValue(row, col);
      console.log('selection: ' + xValue + ' = ' + yValue);
    } else {
      console.log('nothing selected');
    }
  }

  chart.draw(data, options);
});
<script src="https://www.gstatic.com/charts/loader.js"></script>
<div id="chart_div"></div>

【讨论】:

  • hi thnx 及时响应.. 我只是为图表添加图像,如果您单击第一列,然后在同一区域中使用来自特定用户数据的不同数据呈现新图表,我需要一些类似的东西.. . 例如,如果您选择 john 列,则使用存储在不同变量中的新图表绘制新函数..带有特定的用户历史记录我已经添加到 edituserdata 变量中...
  • 示例:jsfiddle.net/60q9bvko/10 我尝试了这个示例,但它不适用于我的问题...我的代码:jsfiddle.net/7jrhpLst/9
  • 我只是纠结于如何制作动态函数 selectHandler()
  • 您好,您能评论一下这个问题吗? ?当你有空时......谢谢......stackoverflow.com/questions/51086089/…
猜你喜欢
  • 2018-07-23
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 2018-10-06
  • 1970-01-01
  • 2012-03-15
  • 2015-08-22
  • 1970-01-01
相关资源
最近更新 更多