Search code examples
javascriptgoogle-visualizationlinechartclickablelinegraph

How to make line clickable on google line chart


I want to make a google line chart with a clickable lines but I seem to only be able to make the data points clickable. Is it possible to also make the line between the data points clickable?


Solution

  • use config option focusTarget: 'category'

    when the line is clicked, the closest point will be selected.

    although, in my current browser, I have to hold the point of the mouse,
    ~ 2px above the line before it will let me click.

    but it does work versus focusTarget: 'datum',
    which only allows the point to be clicked

    see following, working snippet...

    google.charts.load('current', {
      callback: function () {
        var data = new google.visualization.DataTable();
        data.addColumn('number', 'X');
        data.addColumn('number', 'Y');
        data.addRows([
          [0, 0],
          [6, 11],
          [12, 30],
          [18, 52],
          [24, 60],
          [30, 55],
          [36, 62],
          [42, 63],
          [48, 72],
          [54, 71],
          [60, 64],
          [66, 70]
        ]);
    
        // clickable line
        new google.visualization.LineChart(document.getElementById('chart_div0')).draw(data, {
          focusTarget: 'category'
        });
    
        // point only
        new google.visualization.LineChart(document.getElementById('chart_div1')).draw(data, {
          focusTarget: 'datum'
        });
      },
      packages:['corechart']
    });
    <script src="https://www.gstatic.com/charts/loader.js"></script>
    <div>click line</div>
    <div id="chart_div0"></div>
    <div>point only</div>
    <div id="chart_div1"></div>

    EDIT

    if focusTarget: 'category' doesn't work out,
    another option would be to use the 'click' event

    although, nothing is focused nor is a tooltip displayed, the line is still clickable.
    but the location of the click needs to be fairly precise.
    you can use targetID to determine what / which line was clicked...

    see following snippet...

    google.charts.load('current', {
      callback: function () {
        var data = new google.visualization.DataTable();
        data.addColumn('number', 'X0');
        data.addColumn('number', 'Y0');
        data.addColumn('number', 'Y1');
        data.addRows([
          [0, 0, 0],
          [6, 11, 7],
          [12, 30, 13],
          [18, 52, 19],
          [24, 60, 25],
          [30, 55, 31],
          [36, 62, 37],
          [42, 63, 43],
          [48, 72, 49],
          [54, 71, 55],
          [60, 64, 61],
          [66, 70, 67]
        ]);
    
        var chart = new google.visualization.LineChart(document.getElementById('chart_div1'));
    
        google.visualization.events.addListener(chart, 'click', function (props) {
          if (props.targetID.indexOf('line') > -1) {
            var hAxis = chart.getChartLayoutInterface().getHAxisValue(props.x);
            var vAxis = chart.getChartLayoutInterface().getVAxisValue(props.y);
            document.getElementById('chart_div0').innerHTML = props.targetID + ' clicked at [' + hAxis + ', ' + vAxis + ']';
          }
        });
    
        chart.draw(data, {
          lineSize: 3,
          pointSize: 5
        });
      },
      packages:['corechart']
    });
    <script src="https://www.gstatic.com/charts/loader.js"></script>
    <div id="chart_div0">line click result shown here</div>
    <div id="chart_div1"></div>