谷歌BarChart中更好的标签

时间:2018-05-09 14:06:58

标签: javascript charts google-visualization bar-chart

我想在我的BarChart中使用自定义标签,但是使用tics强制添加行,我希望标签位于行之间以表示两行之间的区域。

 options = {
    title: "- - - - - - - - Low - - - - - - - - - - - - - - - - Middle - - - - - - - - - - - - - - - - - - - - - - High - - - - - ",
    animation: {
      startup: 'true',
      easing: 'linear',
      duration: 500
    },
    height: 100,
    legend: {
      position: 'none'
    },
    hAxis: {
      maxValue: 10,
      minValue: 0,
      ticks: [{
        v: 0,
        f: ''
      }, {
        v: 3,
        f: ''
      }, {
        v: 7,
        f: ''
      }, {
        v: 10,
        f: ''
      }]

    },
    width: 700,
    tooltip: {
      trigger: 'hover'
    },
    backgroundColor: "transparent",
  };

我做了一个小提琴,展示了我正在寻找的功能。如果有人知道如何正确解决这个问题,我会非常高兴:

https://jsfiddle.net/zkcps3h8/2/

小提琴代表的功能:

  • 有三个部分:低,中,高
  • 划分这些部分的行
  • 在这些列之下或之上标记

任何解决这个问题的方法都表示赞赏。

2 个答案:

答案 0 :(得分:1)

没有可用于获得所需布局的标准配置选项,
但是当图表完成绘图时,您可以手动添加标签。

使用ticks添加所需部分的行,
然后在添加标签时使用这些线作为参考,
请参阅以下工作代码段...

google.charts.load('current', {
  packages: ['corechart', 'controls']
}).then(function () {
  var options = {
    animation: {
      startup: 'true',
      easing: 'linear',
      duration: 500
    },
    height: 100,
    legend: {
      position: 'none'
    },
    hAxis: {
      maxValue: 10,
      minValue: 0,
      gridlines: {
        color: '#757575'
      },
      ticks: [{
        v: 0,
        f: ''
      }, {
        v: 3,
        f: ''
      }, {
        v: 7,
        f: ''
      }, {
        v: 10,
        f: ''
      }]
    },
    tooltip: {
      trigger: 'hover'
    },
    backgroundColor: 'transparent',
    chartArea: {
      backgroundColor: 'transparent',
      height: '100%',
      width: '100%',
      top: 60,
      left: 72,
      right: 24,
      bottom: 24
    },
    height: '100%',
    width: '100%'
  };

  var container = document.getElementById('s-graph');
  var data_array = $(container).data('values');
  data_array.unshift(['Something', 'Fun', {role: 'style'}]);
  var data = new google.visualization.arrayToDataTable(data_array);
  var chart = new google.visualization.BarChart(container);

  google.visualization.events.addListener(chart, 'animationfinish', function () {
    var chartElements = container.getElementsByTagName('rect');
    var chartArea = chartElements[0];
    var sectionLabels = ['Low', 'Middle', 'High'];
    var svg = container.getElementsByTagName('svg')[0];
    var svgNS = svg.namespaceURI;

    // clone existing label for style, font
    var defaultLabel = container.getElementsByTagName('text')[0];

    var labelIndex = -1;
    var xCoordLeft = parseFloat(chartArea.getAttribute('x'));
    Array.prototype.forEach.call(chartElements, function(rect) {
      if (rect.getAttribute('fill') === options.hAxis.gridlines.color) {
        if (labelIndex > -1) {
          var xCoordRect = parseFloat(rect.getAttribute('x'));
          var xCoordLabel = ((xCoordRect - xCoordLeft) / 2) + xCoordLeft;

          // top label
          var label = defaultLabel.cloneNode(true);
          label.setAttribute('x', xCoordLabel);
          label.setAttribute('y', chartArea.getAttribute('y'));
          label.textContent = sectionLabels[labelIndex];
          svg.appendChild(label);

          // adjust for length of label
          var labelBounds = label.getBBox();
          xCoordLabel = xCoordLabel + (labelBounds.width / 2);
          label.setAttribute('x', xCoordLabel);

          // bottom label
          label = label.cloneNode(true);
          label.setAttribute('y', parseFloat(chartArea.getAttribute('height')) + parseFloat(chartArea.getAttribute('y')) + labelBounds.height);
          svg.appendChild(label);
          xCoordLeft = xCoordRect;
        }
        labelIndex++;
      }
    });
  });

  window.addEventListener('resize', function () {
    chart.draw(data, options);
  });
  chart.draw(data, options);
});
<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 data-values="[[&quot;Tom&quot;, 7.2, &quot;#ed341c&quot;], [&quot;Nisse&quot;, 6.4, &quot;#16593a&quot;]]" id="s-graph"></div>

注意:使用图表方法getImageURI时,手动更改不会显示 如果您需要图表的图像,可以使用html2canvas

答案 1 :(得分:0)

您应该可以通过ticks

下的hAxis媒体资源执行此操作

结帐https://jsfiddle.net/5dqhxbqq/

here是关于它的文档。 hAxis.ticks