【问题标题】:Horizontal Intervals in Google Chart?谷歌图表中的水平间隔?
【发布时间】:2019-02-11 13:51:16
【问题描述】:

我在工作中使用 React,我们一直在考虑尝试使用内置方法在散点图中的点周围绘制框。现在,我们可以使用内置的垂直间隔,但有没有办法也添加一个水平间隔?

我似乎在任何地方都找不到任何关于它的信息。如果不可能,我们可以通过其他方式达到同样的效果吗?

【问题讨论】:

    标签: javascript reactjs charts google-visualization


    【解决方案1】:

    没有内置选项可以围绕一组点绘制一个框。

    但是,有一些图表方法可用于查找绘制点的坐标。

    首先,使用图表法 --> getChartLayoutInterface()
    它返回布局界面。

    布局界面有一个方法 --> getBoundingBox(id)
    其中id 是您要调查的点。

    id 的格式应为 --> point#0#0
    其中第一个 0 是系列,第二个是行。
    例如

    var chartLayout = chart.getChartLayoutInterface();
    var bounds = chartLayout.getBoundingBox('point#0#0');
    

    bounds 将是一个具有 --> 顶部、左侧、高度和宽度属性的对象

    一旦我们有了坐标,我们就可以画出我们自己的盒子了,
    在图表的'ready' 事件中...

    请参阅以下工作 sn-p,
    函数drawBox 接受一个点数组,框应该被绘制在周围。

    drawBox([
      {series: 0, row: 1},
      {series: 0, row: 3},
      {series: 0, row: 4}
    ]);
    

    google.charts.load('current', {
      packages:['controls', 'corechart']
    }).then(function () {
      var data = google.visualization.arrayToDataTable([
        ['x', 'y'],
        [8, 12],
        [4, 5.5],
        [11, 14],
        [4, 5],
        [3, 3.5],
        [6.5, 7]
      ]);
    
      var chartWrapper = new google.visualization.ChartWrapper({
        chartType: 'ScatterChart',
        containerId: 'chart_div',
        dataTable: data,
        options: {
          chartArea: {
            height: '100%',
            width: '100%',
            top: 36,
            left: 36,
            right: 18,
            bottom: 36
          },
          height: '100%',
          legend: {
            position: 'top'
          },
          pointSize: 8,
          width: '100%',
        }
      });
    
      google.visualization.events.addListener(chartWrapper, 'ready', function () {
        google.visualization.events.addListener(chartWrapper.getChart(), 'click', function (gglClick) {
          console.log(JSON.stringify(gglClick));
        });
        drawBox([
          {series: 0, row: 1},
          {series: 0, row: 3},
          {series: 0, row: 4}
        ]);
      });
    
      function drawBox(points) {
        var chart = chartWrapper.getChart();
        var chartLayout = chart.getChartLayoutInterface();
        var container = document.getElementById(chartWrapper.getContainerId())
        var xCoord = {min: null, max: null};
        var yCoord = {min: null, max: null};
    
        points.forEach(function (point) {
          var bounds = chartLayout.getBoundingBox('point#' + point.series + '#' + point.row);
          xCoord.min = xCoord.min || bounds.left;
          xCoord.min = Math.min(bounds.left, xCoord.min);
          xCoord.max = xCoord.max || bounds.left;
          xCoord.max = Math.max(bounds.left, xCoord.max);
          yCoord.min = yCoord.min || bounds.top;
          yCoord.min = Math.min(bounds.top, yCoord.min);
          yCoord.max = yCoord.max || bounds.top;
          yCoord.max = Math.max(bounds.top, yCoord.max);
        });
        xCoord.min = xCoord.min - chartWrapper.getOption('pointSize');
        xCoord.max = xCoord.max + (chartWrapper.getOption('pointSize') * 2);
        yCoord.min = yCoord.min - chartWrapper.getOption('pointSize');
        yCoord.max = yCoord.max + (chartWrapper.getOption('pointSize') * 2);
    
        var svg = container.getElementsByTagName('svg')[0];
        var svgNS = svg.namespaceURI;
        var circle = container.getElementsByTagName('circle')[1];
        var box = document.createElementNS(svgNS, 'polygon');
        box.setAttribute('fill', 'transparent');
        box.setAttribute('stroke', '#000000');
        box.setAttribute('stroke-width', '2');
        box.setAttribute('points', xCoord.min + ',' + yCoord.min + ' ' + xCoord.max + ',' + yCoord.min + ' ' + xCoord.max + ',' + yCoord.max + ' ' + xCoord.min + ',' + yCoord.max);
        circle.parentNode.appendChild(box);
      }
    
      window.addEventListener('resize', function () {
        chartWrapper.draw();
      });
      chartWrapper.draw();
    });
    html, body {
      height: 100%;
      margin: 0px 0px 0px 0px;
      overflow: hidden;
      padding: 0px 0px 0px 0px;
    }
    
    .chart {
      height: 100%;
    }
    <script src="https://www.gstatic.com/charts/loader.js"></script>
    <div class="chart" id="chart_div"></div>

    【讨论】:

    • 哇哦。 WhiteHat 两次前来救援!谢谢亲,真的很有帮助。我在谷歌图表方面的知识非常缺乏:')
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    相关资源
    最近更新 更多