十字线是Google图表的一个漂亮功能,但是如果您为强调单个点的折线图启用了十字线(通过将pointSize设置为稍微大于lineWidth),则它们会产生令人不快的事情:当用户将鼠标悬停在相应的光标上时图例条目,十字线将出现在该图形轨迹中的每个数据点!如果在该迹线中有数百个数据点,则同时出现数百个十字准线将使您一团糟。

对于未设置pointSize的折线图,这是不会发生的(即,只有折线而不是实际数据点可见)。

在通过设置pointSize使点可见的折线图中,是否有任何方法可以使十字准线仅出现在图形上的数据点上,而不是鼠标悬停在图例上?

将鼠标悬停在数据点之一上时,图形如下所示:

http://www.sealevel.info/crosshairs_problem1.png

javascript - 当图例条目具有焦点,线和点都显示在Google折线图中时,取消十字准线-Google Visualization API-LMLPHP

将鼠标悬停在相应的图例条目上时的外观如下:

http://www.sealevel.info/crosshairs_problem2.png

javascript - 当图例条目具有焦点,线和点都显示在Google折线图中时,取消十字准线-Google Visualization API-LMLPHP

如您所见,十字准线几乎覆盖了其他所有内容。

这是生成此图的网页:

http://sealevel.info/crosshairs_problem.html?=1&quadratic=0&lin_PI=1&boxcar=1&boxwidth=3&lin_ci=1&g_date=1930/1-2019/12&c_date=1950/1-2009/12&s_date=1930/1-2018/12

最佳答案

使用图表的'onmouseover'事件的组合,
和一个突变观察者,我们可以防止传说中的十字准线悬停

传递给'onmouseover'事件的属性包括行和列
已经“悬停”的数据点

在图例上悬停->行将为null

然后使用变异观察器找到新的十字线svg path元素
并将其颜色更改为'transparent'

请参阅以下工作片段...



google.charts.load('current', {
  callback: drawChart,
  packages: ['corechart']
});

function drawChart(transparent) {
  var data = new google.visualization.DataTable();
  data.addColumn('number', 'X');
  data.addColumn('number', 'Y');

  for (var i = 0; i < 100; i++) {
    data.addRow([
      Math.floor(Math.random()*100),
      Math.floor(Math.random()*100)
    ]);
  }

  var options = {
    crosshair: {
      trigger: 'both'
    },
    legend: {
      position: 'bottom',
      textStyle: {
        bold: true,
        fontSize: 20
      }
    }
  };

  var chartDiv = document.getElementById('chart_div');
  var chart = new google.visualization.ScatterChart(chartDiv);

  var legendHover = false;

  google.visualization.events.addListener(chart, 'onmouseover', function (gglEvent) {
    // row property will be null on legend hover
    legendHover = (gglEvent.row === null);
  });

  google.visualization.events.addListener(chart, 'onmouseout', function (gglEvent) {
    legendHover = false;
  });

  var observer = new MutationObserver(function (mutations) {
    mutations.forEach(function (mutation) {
      mutation.addedNodes.forEach(function (node) {
        if (node.tagName === 'g') {
          node.childNodes.forEach(function (child) {
            if ((child.tagName === 'path') && (legendHover)) {
              child.setAttribute('stroke', 'transparent');
            }
          });
        }
      });
    });
  });
  observer.observe(chartDiv, {
    childList: true,
    subtree: true
  });

  chart.draw(data, options);
}

<script src="https://www.gstatic.com/charts/loader.js"></script>
<div id="chart_div"></div>







编辑

在选择图例然后移动鼠标后,以上方法未能删除十字准线

请参阅以下工作片段以防止此行为
唯一的缺点是,选择图例/所有点时不会出现十字线

请参阅以下工作片段...



google.charts.load('current', {
  callback: drawChart,
  packages: ['corechart']
});

function drawChart(transparent) {
  var data = new google.visualization.DataTable();
  data.addColumn('number', 'X');
  data.addColumn('number', 'Y');

  for (var i = 0; i < 100; i++) {
    data.addRow([
      Math.floor(Math.random()*100),
      Math.floor(Math.random()*100)
    ]);
  }

  var options = {
    crosshair: {
      trigger: 'both'
    },
    legend: {
      position: 'bottom',
      textStyle: {
        bold: true,
        fontSize: 20
      }
    }
  };

  var chartDiv = document.getElementById('chart_div');
  var chart = new google.visualization.ScatterChart(chartDiv);

  var legendHover = false;
  var selection;

  google.visualization.events.addListener(chart, 'onmouseover', checkLegendHover);
  google.visualization.events.addListener(chart, 'onmouseout', checkLegendHover);

  function checkLegendHover(gglEvent) {
    legendHover = false;
    selection = chart.getSelection();
    if (selection.length > 0) {
      legendHover = (selection[0].row === null);
    }
    if (!legendHover) {
      legendHover = (gglEvent.row === null);
    }
  }

  var observer = new MutationObserver(function (mutations) {
    mutations.forEach(function (mutation) {
      mutation.addedNodes.forEach(function (node) {
        if (node.tagName === 'g') {
          node.childNodes.forEach(function (child) {
            if ((child.tagName === 'path') && (legendHover)) {
              child.setAttribute('stroke', 'transparent');
            }
          });
        }
      });
    });
  });
  observer.observe(chartDiv, {
    childList: true,
    subtree: true
  });

  chart.draw(data, options);
}

<script src="https://www.gstatic.com/charts/loader.js"></script>
<div id="chart_div"></div>

关于javascript - 当图例条目具有焦点,线和点都显示在Google折线图中时,取消十字准线-Google Visualization API,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40158642/

10-11 07:50