如何在Google图表中显示两个不同的工具提示

时间:2019-07-10 06:49:17

标签: javascript charts google-visualization google-chartwrapper

我想在一个柱形图上触发不同的工具提示,一个提示悬停,另一个提示选择栏。

我该如何解决?

我浏览了以下链接,但无法解决。

Show multiple tooltips in Google Charts

Google charts to show multiple tooltip

How to show/hide google chart's tooltip programatically?

ToolTip only shows on "Click"- google charts

1 个答案:

答案 0 :(得分:1)

开箱即用,谷歌图表不提供此功能。

您将需要关闭默认的工具提示

tooltip: {
  trigger: 'none'
}

并添加自己的自定义工具提示。
您可以使用图表事件来确定要显示的工具提示。
'select''onmouseover''onmouseout'

放置自定义工具提示,
您可以使用图表方法-> getChartLayoutInterface
该界面具有用于-> getBoundingBox
的方法 返回图表元素的位置,
只需传递元素的ID(例如图表列)即可。

图表列ID的格式为-> bar#0#0
其中第一个0是序列号,
第二个0是行号。

需要考虑的是如何处理碰撞。
意思是,当选定一列然后将其悬停时,您将显示什么。
或选择一列,然后将另一列悬停,等等。

有关如何完成操作的示例,请参见以下工作摘要

google.charts.load('current', {
  packages: ['corechart']
}).then(function () {
  var data = google.visualization.arrayToDataTable([
    ['City', '2010 Population',],
    ['New York City, NY', 8175000],
    ['Los Angeles, CA', 3792000],
    ['Chicago, IL', 2695000],
    ['Houston, TX', 2099000],
    ['Philadelphia, PA', 1526000]
  ]);

  var options = {
    title: 'Population of Largest U.S. Cities',
    chartArea: {width: '50%'},
    hAxis: {
      title: 'Total Population',
      minValue: 0
    },
    vAxis: {
      title: 'City'
    },
    tooltip: {
      trigger: 'none'
    }
  };

  var chart = new google.visualization.ColumnChart($('#chart_div').get(0));
  var chartLayout;
  var selection;

  google.visualization.events.addListener(chart, 'ready', function () {
    chartLayout = chart.getChartLayoutInterface();
  });

  google.visualization.events.addListener(chart, 'select', function () {
    selection = getSelection();
    if (selection.row !== null) {
      hideTooltip('tooltip-hover');
      showTooltip(selection, 'tooltip-select');
    } else {
      hideTooltip('tooltip-select');
    }
  });

  google.visualization.events.addListener(chart, 'onmouseover', function (sender) {
    selection = getSelection();
    if ((sender.row !== null) && (selection.row !== sender.row)) {
      showTooltip(sender, 'tooltip-hover');
    }
  });

  google.visualization.events.addListener(chart, 'onmouseout', function (sender) {
    selection = getSelection();
    if ((sender.row !== null) && (selection.row !== sender.row)) {
      hideTooltip('tooltip-hover');
    }
  });

  function showTooltip(sender, tooltip) {
    // get position of bar
    var tooltipBounds = chartLayout.getBoundingBox('bar#' + (sender.column - 1) + '#' + sender.row);

    // set values
    $('#' + tooltip + ' .series-name').html(data.getColumnLabel(sender.column));
    $('#' + tooltip + ' .series-x').html(data.getFormattedValue(sender.row, 0));
    $('#' + tooltip + ' .series-y').html(data.getFormattedValue(sender.row, sender.column));

    // set position
    $('#' + tooltip).css({
      left: tooltipBounds.left + 'px',
      top: (tooltipBounds.top - $('#' + tooltip).outerHeight(true)) + 'px'
    });

    // show
    $('#' + tooltip).addClass('shown');
    $('#' + tooltip).removeClass('hidden');
  }

  function hideTooltip(tooltip) {
    // hide
    $('#' + tooltip).addClass('hidden');
    $('#' + tooltip).removeClass('shown');
  }

  function getSelection() {
    selection = chart.getSelection();
    if (selection.length > 0) {
      return selection[0];
    } else {
      return {row: null, column: null};
    }
  }

  chart.draw(data, options);
});
.ggl-tooltip {
  background-color: #ffffff;
  border: 1px solid #E0E0E0;
  font-size: 10pt;
  padding: 8px 8px 8px 8px;
  position: absolute;
}

.ggl-tooltip div {
  margin-top: 4px;
}

.bold {
  font-weight: bold;
}

.hidden {
  display: none;
  visibility: hidden;
}

.shown {
  display: inline-block;
}

#tooltip-hover {
  color: blue;
}

#tooltip-select {
  color: red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src='https://www.gstatic.com/charts/loader.js'></script>
<div id="chart_div"></div>
<div id="tooltip-hover" class="ggl-tooltip hidden">
  <div><span class="series-name bold"></span></div>
  <div>
    <span class="series-x bold"></span>:
    <span class="series-y"></span>
  </div>
</div>
<div id="tooltip-select" class="ggl-tooltip hidden">
  <div><span class="series-name bold"></span></div>
  <div>
    <span class="series-x bold"></span>:
    <span class="series-y"></span>
  </div>
</div>