17

Can I add links in google chart api?

For example,

enter image description here

How could I add link to "Work" or "Eat" ?

Thanks!

  • I don't believe you can insert html code there. – AR. Jun 01 '11 at 18:09
  • Yes, i tried but can't . Any suggestions? –  Jun 01 '11 at 18:39
  • Don't think it's do-able since there's no tag type element, only string for visualization API. It automatically converts tags to regular text. It is possible to use anchor tags in SVG: http://www.w3.org/TR/SVG/images/linking/link01.svg, but I don't think Google API allows it for now. You can ask questions on support forum: http://groups.google.com/group/google-visualization-api - they are usually good at answering it. – AR. Jun 01 '11 at 19:00
  • Duplicate question: http://stackoverflow.com/questions/12701772/insert-links-into-google-charts-api-data – Mark Butler Feb 05 '13 at 03:59

6 Answers6

31

Lucky Frank's answer is good, but it just prints an alert box. Here is a more complete answer. I put the links in the DataTable, then I create a DataView so they are not passed to the chart.

<html>
  <head>
    <script type="text/javascript" src="https://www.google.com/jsapi"></script>
    <script type="text/javascript">
      google.load("visualization", "1", {packages:["corechart"]});
      google.setOnLoadCallback(drawChart);
      function drawChart() {
        var data = google.visualization.arrayToDataTable([
          ['Task', 'link', 'Hours per Day'],
          ['Work', 'http://www.thefreedictionary.com/work', 11],
          ['Eat', 'http://www.thefreedictionary.com/eat', 2],
          ['Commute', 'http://www.thefreedictionary.com/commute', 2],
          ['Watch TV', 'http://www.thefreedictionary.com/television',2],
          ['Sleep',  'http://www.thefreedictionary.com/sleep', 7]
        ]);

        var view = new google.visualization.DataView(data);
        view.setColumns([0, 2]);

        var options = {
          title: 'My Daily Activities'
        };

        var chart = new google.visualization.PieChart( 
          document.getElementById('chart_div'));
        chart.draw(view, options);

        var selectHandler = function(e) {
         window.location = data.getValue(chart.getSelection()[0]['row'], 1 );
        }

        // Add our selection handler.
        google.visualization.events.addListener(chart, 'select', selectHandler);
      }
    </script>
  </head>
  <body>
    <div id="chart_div" style="width: 900px; height: 900px;"></div>
  </body>
</html>

BTW, the Google Charts API really rocks! Thanks whoever wrote this.

Mark Butler
  • 4,361
  • 2
  • 39
  • 39
  • Wow Mark Butler I've been search forever for this! Sorry to reply to an old thread, but do you know how one would be able to get this to work using MySQL? I am currently using MySQL with my existing google chart, but I use two pages, one for the chart, and the other for the json. Thanks! – Nomad Feb 05 '14 at 19:06
  • Yeah that's basically exactly how my code looks, but that doesn't explain how to get a string from SQL and turn it into a link. My chart works perfectly great, but now I want more depth where they click on the point and view the details of the metrics. – Nomad Feb 05 '14 at 19:14
15

http://code.google.com/apis/chart/interactive/docs/events.html

<script type="text/javascript"> 
google.load('visualization', '1', {'packages':['corechart']}); 
google.setOnLoadCallback(drawChart);  
function drawChart()
{
    var data = new google.visualization.DataTable(); 
    data.addColumn('string', 'Name'); 
    data.addColumn('number', 'Count'); 

    data.addRows([ ['Value A',5 ],['Value B',61 ],['Value C',53 ],['Value D',22 ] ]); 
    var chart = new google.visualization.PieChart(document.getElementById('chart_div')); 
    chart.draw(data, {width: 400, height: 280, is3D: true, title: ''});

    google.visualization.events.addListener(chart, 'select', selectHandler); 

    function selectHandler(e)     {   
        alert(data.getValue(chart.getSelection()[0].row, 0));
    }

}   

</script>
Lucky Frank
  • 166
  • 1
  • 2
4

The simple way of adding link to google barchart;

var data = google.visualization.arrayToDataTable([
     ['Element', 'Density', { role: 'style' }, { role: 'link' } ],
     ['Copper', 8.94, '#b87333', '/your/custom/link' ],
     ['Silver', 10.49, 'silver', '/your/custom/link' ],
     ['Gold', 19.30, 'gold', '/your/custom/link' ],
     ['Platinum', 21.45, 'color: #e5e4e2', '/your/custom/link' ]
  ]);

and before chart.draw;

 google.visualization.events.addListener(chart, 'select', function (e) {
            var selection = chart.getSelection();
                if (selection.length) {
                    var row = selection[0].row;
                    let link =data.getValue(row, 3);
                    location.href = link;
                }
        });
Tuncay Elvanagac
  • 1,048
  • 11
  • 13
2

Solution: You just need to select the specific selection of chart by:

google.visualization.events.addListener(table, 'select', function() {
  var row = table.getSelection()[0].row;
  alert('You selected ' + data.getValue(row, 0));
  window.open(data.getValue(row, 0));
});

Full Example: jsfiddle.net

MADHUR GUPTA
  • 1,014
  • 10
  • 14
0

In the Google Charts documentation, an example shows how to use PatternFormat to create hyperlinks, and it shows the critical setting allowHtml which prevents the html characters from being encoded literally.

In my example I combine data from columns 9 and 11 to format a hyperlink in column 11:

    var hyperLinker = new google.visualization.PatternFormat('<a href="${hyperlinkBaseUrl!""}/path/{0}" target="_blank">{1}</a>');
    hyperLinker.format(dataTable, [ 9, 11 ], 11);

    var googleTable = new google.visualization.Table(document.getElementById('dataTable_div'));
    googleTable.draw(dataTable, {showRowNumber: true, allowHtml: true, width: '100%', height: '100%'});
Steve Jones
  • 1,528
  • 19
  • 12
-3

I simply use echo command. You can just replace the text between a comma with a php echo statement. for example you could replace the 11 with a link to sql data:

['Work', 'http://www.thefreedictionary.com/work', < ? php echo $row_rs_age_total['Old']], $row_rs_age_total['Old']; ?>],
Alexander Vogt
  • 17,879
  • 13
  • 52
  • 68
Tim
  • 1