Chú giải công cụ

Mẹo công cụ: giới thiệu

Chú giải công cụ là các hộp nhỏ bật lên khi bạn di chuột qua nội dung nào đó. (Thẻ di chuột nói chung chung hơn và có thể xuất hiện ở bất kỳ đâu trên màn hình; chú giải công cụ luôn được đính kèm vào nội dung nào đó, chẳng hạn như một dấu chấm trên biểu đồ tán xạ hoặc thanh trên biểu đồ thanh.)

Trong tài liệu này, bạn sẽ tìm hiểu cách tạo và tuỳ chỉnh chú giải công cụ trong Google Chart.

Chỉ định loại chú giải công cụ

Biểu đồ của Google tự động tạo chú giải công cụ cho tất cả các biểu đồ cốt lõi. Các tệp này sẽ được kết xuất dưới dạng SVG theo mặc định, ngoại trừ trong IE 8 mà các tệp này sẽ được kết xuất dưới dạng VML. Bạn có thể tạo chú giải công cụ HTML trên biểu đồ cốt lõi bằng cách chỉ định tooltip.isHtml: true trong các tùy chọn biểu đồ được chuyển đến lệnh gọi draw(), việc này cũng sẽ cho phép bạn tạo Hành động trong chú giải công cụ.

Chú giải công cụ tiêu chuẩn

Trong trường hợp không có nội dung tuỳ chỉnh, hệ thống sẽ tự động tạo nội dung cho chú giải công cụ dựa trên dữ liệu cơ bản. Bạn có thể xem chú giải công cụ bằng cách di chuột qua bất kỳ thanh nào trong biểu đồ.

Di chuột lên các thanh để xem chú giải công cụ tiêu chuẩn.

Tuỳ chỉnh nội dung của chú giải công cụ

Trong ví dụ này, chúng tôi thêm nội dung tuỳ chỉnh vào chú giải công cụ bằng cách thêm một cột mới vào DataTable và đánh dấu nội dung đó bằng vai trò chú giải công cụ.

Lưu ý: điều này không được hỗ trợ trong hình ảnh Biểu đồ bong bóng.

        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);
      }

Sử dụng chú giải công cụ HTML

Ví dụ này được xây dựng dựa trên ví dụ trước bằng cách bật chú giải công cụ HTML. Hãy lưu ý rằng bạn sẽ thêm tooltip.isHtml: true vào các tuỳ chọn biểu đồ.

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);
      }

Điều đó trông không khác nhiều, nhưng giờ đây chúng ta có thể tuỳ chỉnh HTML.

Tuỳ chỉnh nội dung HTML

Các ví dụ trước đều dùng chú giải công cụ với nội dung văn bản thuần tuý, nhưng sức mạnh thực sự của chú giải công cụ HTML sẽ xuất hiện khi bạn có thể tuỳ chỉnh chúng bằng mã đánh dấu HTML. Để bật tính năng này, bạn phải làm hai việc sau:

  1. Chỉ định tooltip.isHtml: true trong các tùy chọn biểu đồ. Lệnh này yêu cầu biểu đồ vẽ các chú giải công cụ trong HTML (trái ngược với SVG).
  2. Đánh dấu toàn bộ cột hoặc một ô cụ thể trong bảng dữ liệu bằng thuộc tính html tuỳ chỉnh. Một cột có thể dữ liệu với vai trò chú giải công cụ và thuộc tính HTML sẽ là:
    dataTable.addColumn({'type': 'string', 'role': 'tooltip', 'p': {'html': true}})

    Lưu ý: tính năng này không hoạt động với hình ảnh Biểu đồ bong bóng. Nội dung của chú giải công cụ HTML của Bubble Graph không thể tùy chỉnh.

Quan trọng: Hãy đảm bảo rằng HTML trong chú giải công cụ của bạn đến từ một nguồn đáng tin cậy. Nếu nội dung HTML tuỳ chỉnh chứa bất kỳ nội dung nào do người dùng tạo, thì việc thoát nội dung đó là rất quan trọng. Nếu không, hình ảnh đẹp mắt của bạn có thể dễ bị tấn công bởi XSS.

Nội dung HTML tuỳ chỉnh có thể đơn giản như thêm thẻ <img> hoặc in đậm một văn bản:

Nội dung HTML tuỳ chỉnh cũng có thể bao gồm nội dung được tạo động. Ở đây, chúng tôi thêm chú giải công cụ chứa bảng được tạo động cho từng giá trị danh mục. Do chú giải công cụ được đính kèm vào giá trị của hàng, di chuột qua bất kỳ thanh nào sẽ hiển thị chú giải công cụ HTML.

Ví dụ này minh họa cách đính kèm chú giải công cụ HTML tùy chỉnh vào một cột miền. (Trong các ví dụ trước, nó đã được đính kèm vào cột dữ liệu.) Để bật chú giải công cụ cho trục miền, hãy đặt tuỳ chọn 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>';
}

Chú giải công cụ xoay

Bạn có thể xoay vòng chú giải công cụ trong Google Biểu đồ bằng CSS. Trong biểu đồ dưới đây, các chú giải công cụ được xoay 30° theo chiều kim đồng hồ bằng cách sử dụng CSS cùng dòng này ngay trước div biểu đồ:

<style>div.google-visualization-tooltip { transform: rotate(30deg); }</style>

Lưu ý rằng tuỳ chọn này chỉ hoạt động với chú giải công cụ HTML, tức là những chú thích có tuỳ chọn 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>

Đặt biểu đồ trong chú giải công cụ

Chú giải công cụ HTML có thể bao gồm hầu hết nội dung HTML mà bạn thích, ngay cả biểu đồ Google. Với biểu đồ bên trong chú giải công cụ, người dùng có thể nhận thêm thông tin khi di chuột qua một phần tử dữ liệu. Đây là một cách hiệu quả để cung cấp thông tin tổng quan nhanh chóng mà vẫn giúp người dùng tìm hiểu kỹ hơn khi thích.

Biểu đồ cột bên dưới cho thấy biểu đồ về lượng người xem gần đây nhất của một số sự kiện thể thao lớn, trong đó có các chú giải công cụ cho mỗi biểu đồ biểu đồ dạng đường về lượng người xem trung bình trong 10 năm qua.

Một số điều cần lưu ý tại đây. Trước tiên, bạn cần vẽ một biểu đồ có thể in cho từng tập dữ liệu sẽ xuất hiện trong chú giải công cụ. Thứ hai, mỗi biểu đồ chú giải công cụ cần có một trình xử lý sự kiện "ready" mà chúng tôi sẽ gọi qua addListener để tạo một biểu đồ có thể in.

LƯU Ý QUAN TRỌNG: Tất cả biểu đồ chú giải công cụ phải được vẽ trước biểu đồ chính. Điều này là cần thiết để lấy hình ảnh để thêm vào DataTable của biểu đồ chính.

Các phần quan trọng
      // 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);

      }
Trang web đầy đủ
<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>

Thao tác trong chú giải công cụ

Chú giải công cụ cũng có thể bao gồm các thao tác do JavaScript xác định. Ví dụ đơn giản: sau đây là chú giải công cụ chứa một thao tác bật lên hộp thoại khi người dùng nhấp vào "Xem sách mẫu":

Tuỳ chọn tooltip kích hoạt khi người dùng chọn một nêm chiếc bánh, khiến mã được xác định trong setAction được chạy:

        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);
      }

Bạn có thể visible, enabled, cả hai hoặc cả hai. Khi biểu đồ Google được hiển thị, hành động chú giải công cụ chỉ hiển thị nếu hiển thị và chỉ có thể nhấp nếu hành động này được bật. (Đã tắt nhưng các hành động hiển thị sẽ chuyển sang màu xám.)

visibleenabled phải là các hàm trả về giá trị đúng hoặc sai. Các hàm đó có thể phụ thuộc vào mã nhận dạng thành phần và lựa chọn của người dùng, cho phép bạn tinh chỉnh chế độ hiển thị hành động và khả năng nhấp.

Chú giải công cụ có thể kích hoạt trên focus cũng như selection. Tuy nhiên, với các hành động trong chú giải công cụ, bạn nên dùng selection. Điều đó khiến chú giải công cụ tồn tại, cho phép người dùng chọn hành động dễ dàng hơn.

Tất nhiên, các thao tác không nhất thiết phải là cảnh báo: bạn có thể thực hiện một thao tác bất kỳ từ JavaScript. Ở đây, chúng tôi sẽ thêm hai hành động: một hành động để phóng to biểu đồ hình tròn và một hành động khác để thu nhỏ.

        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);
      }

Chú thích dữ liệu

Bạn có thể phủ trực tiếp văn bản vào Biểu đồ Google bằng cách sử dụng annotationText thay vì tooltip làm cột vai trò. (Bạn có thể xem chú giải công cụ bằng cách di chuột qua chú thích.)

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);
}

Biểu đồ được hỗ trợ

Chú giải công cụ HTML hiện được hỗ trợ cho các loại biểu đồ sau:

Nếu bạn đang sử dụng vai trò annotationText hoặc tooltip, vui lòng xem tài liệu về các vai trò để đọc về những thay đổi trong tương lai và cách tránh các cơn đau trong tương lai.