【问题标题】:Hierarchies graphs in google charts谷歌图表中的层次结构图
【发布时间】:2016-10-24 22:56:02
【问题描述】:

我怎样才能构建这样的东西(在一个轴上有子类别)

【问题讨论】:

    标签: javascript charts google-visualization


    【解决方案1】:

    虽然请求的布局无法通过标准配置选项获得,
    如果您可以手动修改 svg,则可以实现

    当图表的'ready' 事件触发时,添加类别标签和分组线

    请参阅下面的工作 sn-p,这只是显示可能性的示例

    根据图表的大小和位置做了几个假设...

    google.charts.load('current', {
      callback: drawChart,
      packages: ['corechart']
    });
    
    function drawChart() {
      var data = google.visualization.arrayToDataTable([
        ['State', 'Store', 'Sales'],
        ['California', 'Donald\'s Market', 1560],
        ['California', 'Alexei\'s Specialties', 1090],
        ['California', '24-Seven', 345],
        ['Texas', 'Albert Market', 245],
        ['Texas', 'Jim\'s Market', 245],
        ['Texas', 'International Food Store', 82]
      ]);
    
      var options = {
        bars: 'horizontal',
        chartArea: {
          left: 204
        },
        height: 400,
        vAxis: {
          textStyle: {
            fontSize: 10
          }
        }
      };
    
      var chartDiv = document.getElementById('chart_div');
      var chart = new google.visualization.BarChart(chartDiv);
    
      var view = new google.visualization.DataView(data);
      view.setColumns([1, 2, {
        calc: 'stringify',
        sourceColumn: 2,
        type: 'string',
        role: 'annotation'
      }]);
    
      google.visualization.events.addListener(chart, 'ready', function () {
        var rowIndex = -1;
        var stateValue = '';
        var svgParent = chartDiv.getElementsByTagName('svg')[0];
        Array.prototype.forEach.call(chartDiv.getElementsByTagName('text'), function(text) {
          var groupLabel;
          if ((text.getAttribute('text-anchor') === 'end') &&
              (parseFloat(text.getAttribute('x')) < 200)) {
            rowIndex++;
            if (stateValue !== data.getValue(rowIndex, 0)) {
              stateValue = data.getValue(rowIndex, 0);
              groupLabel = text.cloneNode(true);
              groupLabel.setAttribute('x', '60');
              groupLabel.innerHTML = stateValue;
              svgParent.appendChild(groupLabel);
              addGroupLine(groupLabel, -24);
            }
            if (rowIndex === (data.getNumberOfRows() - 1)) {
              addGroupLine(text, 16);
            }
          }
        });
    
        function addGroupLine(text, yOffset) {
          var groupLine = chartDiv.getElementsByTagName('rect')[0].cloneNode(true);
          groupLine.setAttribute('y', parseFloat(text.getAttribute('y')) + yOffset);
          groupLine.setAttribute('x', '16');
          groupLine.setAttribute('height', '0.8');
          groupLine.setAttribute('width', '188');
          groupLine.setAttribute('stroke', 'none');
          groupLine.setAttribute('stroke-width', '0');
          groupLine.setAttribute('fill', '#000000');
          svgParent.appendChild(groupLine);
        }
      });
    
      chart.draw(view, options);
    }
    <script src="https://www.gstatic.com/charts/loader.js"></script>
    <div id="chart_div"></div>

    【讨论】:

    • 嗨,我正在尝试做这样的事情。你能解释更多关于 rowIndex 的信息吗?如果我有 view.setColumns([{type:'string',calc:function (dt, row) {return dt.getFormattedValue(row, 5)}},9,10,11]) - 我想添加第 6 列显示为子类别,我应该如何设置 rowIndex?或者代码应该是什么? (我从 google sheet 获取数据)
    猜你喜欢
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    相关资源
    最近更新 更多