提示:简介
提示是将鼠标悬停在某项内容上时弹出的小框。(悬停卡更为通用,可以出现在屏幕上的任何位置;提示始终附加到某些内容上,例如散点图上的点或条形图上的条形)。
在本文档中,您将了解如何在 Google 图表中创建和自定义提示。
指定提示类型
Google 图表会自动为所有核心图表创建提示。
它们默认以 SVG 格式呈现,但在 IE 8 中,此类文件将呈现为 VML。您可以在核心图表上创建 HTML 提示,方法是在传递给 draw() 调用的图表选项中指定 tooltip.isHtml: true
,这样也可以创建工具提示操作。
标准提示
如果没有任何自定义内容,系统将根据底层数据自动生成提示内容。您可以通过将鼠标悬停在图表中的任何条形上方来查看提示。
自定义提示内容
在此示例中,我们通过向 DataTable 添加新列并使用提示角色对其进行标记,向提示添加自定义内容。
注意:气泡图可视化图表不支持此操作。
google.charts.load('current', {'packages':['corechart']}); google.charts.setOnLoadCallback(drawChart); function drawChart() { var dataTable = new google.visualization.DataTable(); dataTable.addColumn('string', 'Year'); dataTable.addColumn('number', 'Sales'); // A column for custom tooltip content dataTable.addColumn({type: 'string', role: 'tooltip'}); dataTable.addRows([ ['2010', 600,'$600K in our first year!'], ['2011', 1500, 'Sunspot activity made this our best year ever!'], ['2012', 800, '$800K in 2012.'], ['2013', 1000, '$1M in sales last year.'] ]); var options = { legend: 'none' }; var chart = new google.visualization.ColumnChart(document.getElementById('tooltip_action')); chart.draw(dataTable, options); }
使用 HTML 提示
此示例在上一个示例的基础上启用了 HTML 提示。请注意,图表选项中添加了 tooltip.isHtml: true
。
google.charts.load('current', {'packages':['corechart']}); google.charts.setOnLoadCallback(drawChart); function drawChart() { var dataTable = new google.visualization.DataTable(); dataTable.addColumn('string', 'Year'); dataTable.addColumn('number', 'Sales'); // A column for custom tooltip content dataTable.addColumn({type: 'string', role: 'tooltip'}); dataTable.addRows([ ['2010', 600,'$600K in our first year!'], ['2011', 1500, 'Sunspot activity made this our best year ever!'], ['2012', 800, '$800K in 2012.'], ['2013', 1000, '$1M in sales last year.'] ]); var options = { tooltip: {isHtml: true}, legend: 'none' }; var chart = new google.visualization.ColumnChart(document.getElementById('col_chart_html_tooltip')); chart.draw(dataTable, options); }
这看起来没有太大变化,但现在我们可以自定义 HTML。
自定义 HTML 内容
前面的示例都使用包含纯文本内容的提示,但当您可以使用 HTML 标记对其进行自定义时,HTML 提示的真正强大之处就体现出来了。要启用此功能,您必须执行以下两项操作:
-
在图表选项中指定
tooltip.isHtml: true
。这将指示图表以 HTML(而不是 SVG)格式绘制提示。 -
使用
html
自定义属性标记数据表中的整列或特定单元格。具有提示角色和 HTML 属性的数据表列将如下所示:
dataTable.addColumn({'type': 'string', 'role': 'tooltip', 'p': {'html': true}})
注意:这不适用于气泡图可视化图表。气泡图 HTML 提示的内容不可自定义。
重要提示:请确保提示中的 HTML 来自可信来源。
如果自定义 HTML 内容包含任何用户生成的内容,请务必对该内容进行转义。否则,精美的可视化内容可能会受到 XSS 攻击。
自定义 HTML 内容可以像添加 <img>
标记或加粗某些文本一样简单:
自定义 HTML 内容还可以包含动态生成的内容。 我们在这里添加了一条提示,其中包含为每个类别值动态生成的表格。由于提示附加到行值,因此将鼠标悬停在任何条形上都将显示 HTML 提示。
此示例演示了如何将自定义 HTML 提示附加到网域列。(在前面的示例中,它被附加到数据列。)如需开启网域轴的提示,请设置 focusTarget: 'category'
选项。
function drawChart() { var dataTable = new google.visualization.DataTable(); dataTable.addColumn('string', 'Country'); // Use custom HTML content for the domain tooltip. dataTable.addColumn({'type': 'string', 'role': 'tooltip', 'p': {'html': true}}); dataTable.addColumn('number', 'Gold'); dataTable.addColumn('number', 'Silver'); dataTable.addColumn('number', 'Bronze'); dataTable.addRows([ ['USA', createCustomHTMLContent('https://upload.wikimedia.org/wikipedia/en/a/a4/Flag_of_the_United_States.svg', 46, 29, 29), 46, 29, 29], ['China', createCustomHTMLContent('https://upload.wikimedia.org/wikipedia/commons/f/fa/Flag_of_the_People%27s_Republic_of_China.svg', 38, 27, 23), 38, 27, 23], ['UK', createCustomHTMLContent('https://upload.wikimedia.org/wikipedia/commons/a/ae/Flag_of_the_United_Kingdom.svg', 29, 17, 19), 29, 17, 19] ]); var options = { title: 'London Olympics Medals', colors: ['#FFD700', '#C0C0C0', '#8C7853'], // This line makes the entire category's tooltip active. focusTarget: 'category', // Use an HTML tooltip. tooltip: { isHtml: true } }; // Create and draw the visualization. new google.visualization.ColumnChart(document.getElementById('custom_html_content_div')).draw(dataTable, options); } function createCustomHTMLContent(flagURL, totalGold, totalSilver, totalBronze) { return '<div style="padding:5px 5px 5px 5px;">' + '<img src="' + flagURL + '" style="width:75px;height:50px"><br/>' + '<table class="medals_layout">' + '<tr>' + '<td><img src="https://upload.wikimedia.org/wikipedia/commons/1/15/Gold_medal.svg" style="width:25px;height:25px"/></td>' + '<td><b>' + totalGold + '</b></td>' + '</tr>' + '<tr>' + '<td><img src="https://upload.wikimedia.org/wikipedia/commons/0/03/Silver_medal.svg" style="width:25px;height:25px"/></td>' + '<td><b>' + totalSilver + '</b></td>' + '</tr>' + '<tr>' + '<td><img src="https://upload.wikimedia.org/wikipedia/commons/5/52/Bronze_medal.svg" style="width:25px;height:25px"/></td>' + '<td><b>' + totalBronze + '</b></td>' + '</tr>' + '</table>' + '</div>'; }
旋转提示
Google 图表中的提示可以通过 CSS 进行旋转。在下面的图表中,提示在图表 div 前面使用此内嵌 CSS 顺时针旋转 30°:
<style>div.google-visualization-tooltip { transform: rotate(30deg); }</style>
请注意,这仅适用于 HTML 提示,即带有 isHtml: true
选项的提示。
<html> <head> <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script> <script type="text/javascript"> google.charts.load('current', {'packages':['corechart']}); google.charts.setOnLoadCallback(drawChart); function drawChart() { var data = google.visualization.arrayToDataTable([ ['Year', 'Fixations'], ['2015', 80], ['2016', 90], ['2017', 100], ['2018', 90], ['2019', 80], ]); var options = { tooltip: { isHtml: true }, // CSS styling affects only HTML tooltips. legend: { position: 'none' }, bar: { groupWidth: '90%' }, colors: ['#A61D4C'] }; var chart = new google.visualization.ColumnChart(document.getElementById('tooltip_rotated')); chart.draw(data, options); } </script> </head> <body> <!-- The next line rotates HTML tooltips by 30 degrees clockwise. --> <style>div.google-visualization-tooltip { transform: rotate(30deg); }</style> <div id="tooltip_rotated" style="width: 400px; height: 400px;"></div> </body> </html>
在提示中放置图表
HTML 提示可以包含您喜欢的大多数 HTML 内容,甚至可以包含 Google 图表。借助提示内的图表,用户将鼠标悬停在数据元素上时可以获得更多信息:这样不仅能提供一目了然的详细信息,还能让用户根据需要深入了解。
下面的柱形图显示了几个大型体育赛事的近期观看人数最多的图表,每个赛事的提示中显示了过去 10 年平均观看人数的折线图。
这里有几点需要注意。首先,需要为要在提示中显示的每组数据绘制一个可打印图表。其次,每个提示图表都需要一个“ready”事件处理脚本,我们通过 addListener
调用该处理脚本来创建可打印图表。
重要提示:必须在主要图表之前绘制所有提示图表。抓取图片以添加到主图表的 DataTable 中时,必须执行此操作。
// Draws your charts to pull the PNGs for your tooltips. function drawTooltipCharts() { var data = new google.visualization.arrayToDataTable(tooltipData); var view = new google.visualization.DataView(data); // For each row of primary data, draw a chart of its tooltip data. for (var i = 0; i < primaryData.length; i++) { // Set the view for each event's data view.setColumns([0, i + 1]); var hiddenDiv = document.getElementById('hidden_div'); var tooltipChart = new google.visualization.LineChart(hiddenDiv); google.visualization.events.addListener(tooltipChart, 'ready', function() { // Get the PNG of the chart and set is as the src of an img tag. var tooltipImg = '<img src="' + tooltipChart.getImageURI() + '">'; // Add the new tooltip image to your data rows. primaryData[i][2] = tooltipImg; }); tooltipChart.draw(view, tooltipOptions); } drawPrimaryChart(); } function drawPrimaryChart() { var data = new google.visualization.DataTable(); data.addColumn('string', 'Event'); data.addColumn('number', 'Highest Recent Viewership'); // Add a new column for your tooltips. data.addColumn({ type: 'string', label: 'Tooltip Chart', role: 'tooltip', 'p': {'html': true} }); // Add your data (with the newly added tooltipImg). data.addRows(primaryData); var visibleDiv = document.getElementById('visible_div'); var primaryChart = new google.visualization.ColumnChart(visibleDiv); primaryChart.draw(data, primaryOptions); }
<html> <head> <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script> <script type="text/javascript"> google.charts.load('current', {'packages':['corechart']}); google.charts.setOnLoadCallback(drawTooltipCharts); // Set up data for visible chart. var primaryData = [ ['NBA Finals', 22.4], ['NFL Super Bowl', 111.3], ['MLB World Series', 19.2], ['UEFA Champions League Final', 1.9], ['NHL Stanley Cup Finals', 6.4], ['Wimbledon Men\'s Championship', 2.4] ]; // Set up data for your tooltips. var tooltipData = [ ['Year', 'NBA Finals', 'NFL Super Bowl', 'MLB World Series', 'UEFA Champions League Final', 'NHL Stanley Cup Finals', 'Wimbledon Men\'s Championship'], ['2005', 12.5, 98.7, 25.3, 0.6, 3.3, 2.8], ['2006', 13.0, 90.7, 17.1, 0.8, 2.8, 3.4], ['2007', 9.3, 93.0, 15.8, 0.9, 1.8, 3.8], ['2008', 14.9, 97.5, 17.1, 1.3, 4.4, 5.1], ['2009', 14.3, 98.7, 13.6, 2.1, 4.9, 5.7], ['2010', 18.2, 106.5, 19.4, 2.2, 5.2, 2.3], ['2011', 17.4, 111.0, 14.3, 4.2, 4.6, 2.7], ['2012', 16.8, 111.3, 16.6, 2.0, 2.9, 3.9], ['2013', 16.6, 108.7, 12.7, 1.4, 5.8, 2.5], ['2014', 15.7, 111.3, 15.0, 1.9, 4.7, 2.4] ]; var primaryOptions = { title: 'Highest U.S. Viewership for Most Recent Event (in millions)', legend: 'none', tooltip: {isHtml: true} // This MUST be set to true for your chart to show. }; var tooltipOptions = { title: 'U.S. Viewership Over The Last 10 Years (in millions)', legend: 'none' }; // Draws your charts to pull the PNGs for your tooltips. function drawTooltipCharts() { var data = new google.visualization.arrayToDataTable(tooltipData); var view = new google.visualization.DataView(data); // For each row of primary data, draw a chart of its tooltip data. for (var i = 0; i < primaryData.length; i++) { // Set the view for each event's data view.setColumns([0, i + 1]); var hiddenDiv = document.getElementById('hidden_div'); var tooltipChart = new google.visualization.LineChart(hiddenDiv); google.visualization.events.addListener(tooltipChart, 'ready', function() { // Get the PNG of the chart and set is as the src of an img tag. var tooltipImg = '<img src="' + tooltipChart.getImageURI() + '">'; // Add the new tooltip image to your data rows. primaryData[i][2] = tooltipImg; }); tooltipChart.draw(view, tooltipOptions); } drawPrimaryChart(); } function drawPrimaryChart() { var data = new google.visualization.DataTable(); data.addColumn('string', 'Event'); data.addColumn('number', 'Highest Recent Viewership'); // Add a new column for your tooltips. data.addColumn({ type: 'string', label: 'Tooltip Chart', role: 'tooltip', 'p': {'html': true} }); // Add your data (with the newly added tooltipImg). data.addRows(primaryData); var visibleDiv = document.getElementById('visible_div'); var primaryChart = new google.visualization.ColumnChart(visibleDiv); primaryChart.draw(data, primaryOptions); } </script> </head> <body> <div id="hidden_div" style="display:none"></div> <div id="visible_div" style="height:300px"></div> </body> </html>
提示操作
提示还可以包含 JavaScript 定义的操作。举一个简单的例子,以下是一个包含操作的提示,该提示会在用户点击“查看示例图书”时弹出对话框:
当用户选择饼干时,会触发 tooltip
选项,从而导致运行 setAction
中定义的代码:
google.charts.load('current', {'packages':['corechart']}); google.charts.setOnLoadCallback(drawChart); function drawChart() { var data = google.visualization.arrayToDataTable([ ['Genre', 'Percentage of my books'], ['Science Fiction', 217], ['General Science', 203], ['Computer Science', 175], ['History', 155], ['Economics/Political Science', 98], ['General Fiction', 72], ['Fantasy', 51], ['Law', 29] ]); var chart = new google.visualization.PieChart( document.getElementById('tooltip_action')); var options = { tooltip: { trigger: 'selection' }}; chart.setAction({ id: 'sample', text: 'See sample book', action: function() { selection = chart.getSelection(); switch (selection[0].row) { case 0: alert('Ender\'s Game'); break; case 1: alert('Feynman Lectures on Physics'); break; case 2: alert('Numerical Recipes in JavaScript'); break; case 3: alert('Truman'); break; case 4: alert('Freakonomics'); break; case 5: alert('The Mezzanine'); break; case 6: alert('The Color of Magic'); break; case 7: alert('The Law of Superheroes'); break; } } }); chart.draw(data, options); }
操作可以是 visible
和/或 enabled
,也可以两者都不是。呈现 Google 图表时,提示操作仅在可见时显示,并且仅在已启用时可点击。(已停用,但可见操作会显示为灰色。)
visible
和 enabled
应该是返回 true 或 false 值的函数。这些函数可以取决于元素 ID 和用户选择,从而让您能够微调操作可见性和可点击性。
提示可以在 focus
和 selection
上触发。不过,对于提示操作,最好使用 selection
。这样一来,提示就会保留,以便用户更轻松地选择操作。
当然,这些操作不一定是提醒:您可以通过 JavaScript 执行的任何操作,都可以通过操作执行。在这里,我们将添加两项操作 其中一项用于放大饼图的楔形部分 另一项用于缩小饼图
google.charts.load('current', {'packages':['corechart']}); google.charts.setOnLoadCallback(drawChart); function drawChart() { var data = google.visualization.arrayToDataTable([ ['Genre', 'Percentage of my books'], ['Science Fiction', 217], ['General Science', 203], ['Computer Science', 175], ['History', 155], ['Economics & Political Science', 98], ['General Fiction', 72], ['Fantasy', 51], ['Law', 29] ]); var chart = new google.visualization.PieChart( document.getElementById('tooltip_action_2')); var options = { tooltip: { trigger: 'selection' }}; chart.setAction({ id: 'increase', text: 'Read 20 more books', action: function() { data.setCell(chart.getSelection()[0].row, 1, data.getValue(chart.getSelection()[0].row, 1) + 20); chart.draw(data, options); } }); chart.setAction({ id: 'decrease', text: 'Read 20 fewer books', action: function() { data.setCell(chart.getSelection()[0].row, 1, data.getValue(chart.getSelection()[0].row, 1) - 20); chart.draw(data, options); } }); chart.draw(data, options); }
为数据添加注释
您可以使用 annotationText
(而不是 tooltip
)作为列角色,直接在 Google 图表上叠加文本。(您可以将鼠标悬停在注释上,查看提示。)
function drawChart() { var dataTable = new google.visualization.DataTable(); dataTable.addColumn('string', 'Year'); dataTable.addColumn('number', 'USA'); dataTable.addColumn({type: 'string', role: 'annotation'}); dataTable.addColumn({type: 'string', role: 'annotationText', p: {html:true}}); dataTable.addColumn('number', 'China'); dataTable.addColumn('number', 'UK'); dataTable.addRows([ ['2000', 94, '', '', 58, 28], ['2004', 101, '', '', 63, 30], ['2008', 110, 'An all time high!', '<img width=100px src="https://upload.wikimedia.org/wikipedia/en/a/a4/Flag_of_the_United_States.svg">', 100, 47], ['2012', 104, '', '', 88, 65] ]); var options = { tooltip: {isHtml: true}}; var chart = new google.visualization.LineChart(document.getElementById('tt_6_annotation')); chart.draw(dataTable, options); }
支持的图表
HTML 提示目前适用于以下图表类型:- AreaChart
- BarChart
- CalendarChart
- CandlestickChart
- ColumnChart
- ComboChart
- LineChart
- PieChart
- 桑基图
- ScatterChart
- 时间轴
如果您使用的是 annotationText
或 tooltip
角色,请参阅有关角色的文档,了解未来的变更以及如何避免日后的痛苦。