ツールチップ

ツールチップ: 概要

ツールチップは、アイテムにカーソルを合わせるとポップアップする小さなボックスです。(ホバーカードは一般的なもので、画面の任意の場所に表示される可能性があります)。ツールチップは、散布図上のドットや棒グラフ上のバーなどに常に添付されます)。

このドキュメントでは、Google Chart でツールチップを作成してカスタマイズする方法について説明します。

ツールチップのタイプの指定

Google Charts は、すべてのコアチャートのツールチップを自動的に作成します。デフォルトでは SVG としてレンダリングされますが、IE8 では 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 マークアップを使用してツールチップをカスタマイズできます。これを有効にするには、次の 2 つのことを行う必要があります。

  1. グラフ オプションで tooltip.isHtml: true を指定します。これにより、(SVG ではなく)HTML でツールチップを描画するようにグラフが設定されます。
  2. 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 ツールチップには、Google グラフなど、任意の HTML コンテンツを含めることができます。ツールチップ内にグラフを表示すると、ユーザーがデータ要素にカーソルを合わせたときに追加情報が得られます。これは、ユーザーが好みのときに深く掘り下げながら、概要を一目で確認できる優れた方法です。

以下の縦棒グラフは、いくつかの主要なスポーツ イベントの最新の視聴者数のグラフを示しています。それぞれのツールチップには、過去 10 年間の平均視聴者数の折れ線グラフが表示されます。

ここで注意すべき点がいくつかあります。まず、ツールチップに表示するデータのデータセットごとに、印刷可能なグラフを描画する必要があります。次に、各ツールチップ グラフで「準備完了」イベント ハンドラが必要です。これは、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);
      }

アクションは、visibleenabled、またはその両方にできます。Google グラフをレンダリングすると、ツールチップ アクションは表示されている場合にのみ表示され、有効になっている場合にのみクリックできます。(無効だが、操作がグレー表示になる)。

visibleenabled は、true または false の値を返す関数にする必要があります。これらの機能は、要素 ID とユーザー選択に依存し、アクションの可視性とクリック可能性を微調整できます。

ツールチップは、focusselection でトリガーできます。ただし、ツールチップ アクションでは、selection を使用することをおすすめします。これによりツールチップが維持され、ユーザーは簡単にアクションを選択できます。

アクションはアラートである必要はありません。JavaScript で実行できるものはもちろん、アクションからも実行できます。ここでは、2 つのアクションを追加します。1 つは円グラフの角度調整用パーツを拡大し、もう 1 つは縮小します。

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

データのアノテーション

ロールとして tooltip ではなく annotationText を使用することで、テキストを 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 ツールチップは現在、次のグラフの種類でサポートされています。

annotationText または tooltip のロールを使用している場合は、ロールに関するドキュメントを確認して、今後の変更と、将来の問題を回避する方法を確認してください。