I have downloaded a small code snippet that allows me to filter a google
chart series when the user clicks on the legend.
Basically, I have the code that generates the graph and then an event
listener that hides/shows series depending on the user click.
What I would like to do is to either trigger the event within the code or
to loop through the series to hide some of them depending on the parameter.
Here is my code :
function get_performances_graph_data(){
$values = $kpis_array = array();
$kpis = get_kpi_array();
global $wpdb;
$i = 0;
foreach( $kpis as $k ){
if( !isset( $k['hidden'] ) ){
$h = $k['header'];
$format = 'number';
if( isset( $k['format'] ) )
$format = $k['format'];
$temp = array( 'label' => $h , 'slug' => toUri( $h ) , 'id' => $i
, 'format' => $format );
$kpis_array[] = $temp;
$i++;
}
}
$req = "SELECT * FROM " . gq_prefix() . "performances ORDER BY date ASC";
// debug_var( $req );
$performances = $wpdb->get_results( $req );
$prev_val = array();
foreach( $performances as $p ){
// debug_var( $p );
foreach( $kpis as $k ){
if( !isset( $k['hidden'] ) ){
$slug = toUri( $k['header'] );
$val = '';
if( isset( $p->$slug ) )
$val = $p->$slug;
if( isset( $k['format'] ) && $k['format'] == 'date' ){
$date_str = explode( ";" , str_replace( '-' , ';' , $val )
);
$y = $date_str[0];
$m = $date_str[1] - 1;
$d = $date_str[2];
$row[$slug] = "new Date($y, $m, $d)";
}
else{
if( empty( $val ) ){
if( isset( $prev_val[$slug] ) )
$val = $prev_val[$slug];
}
else
$prev_val[$slug] = $val;
$row[$slug] = $val;
}
// debug_var( $val , $slug );
}
}
$values[] = $row;
}
// debug_var( $values );
return array( 'values' => $values , 'kpis' => $kpis_array );
}
function get_ticks( $dataset ){
// debug_var( $dataset );
$first = reset( $dataset )['date'];
$last = end( $dataset )['date'];
$dates = array( $first );
// debug_var( $last , $first );
$f_s = explode( ';' , str_replace( 'new Date(' , '' , str_replace( ')' , ''
, str_replace( ', ' , ';' , $first ) ) ) );
$y = $f_s[0];
$m = $f_s[1];
// $d = $f_s[2];
// debug_var( $f_s );
$l_s = explode( ';' , str_replace( 'new Date(' , '' , str_replace( ')' , ''
, str_replace( ', ' , ';' , $last ) ) ) );
$y_l = $l_s[0];
$m_l = $l_s[1];
// $d = $l_s[2];
// debug_var( $l_s );
$out = false;
while( !$out ){
if( $m >= 6 ){
// debug_var( $m , 1 );
$m = 0;
// debug_var( $m , 11 );
$y++;
}
else{
// debug_var( $m , 2 );
$m = 6;
}
// debug_var( $y , $y_l );
// debug_var( $m , $m_l );
if( $y > $y_l || ( $y == $y_l && $m > $m_l ) )
$out = true;
else
$dates[] = "$y,0$m,01";
}
$dates[] = $last;
$output = '[';
foreach( $dates as $d ){
$output .= "new Date($d), "; // 2014,3,15
}
$output = rtrim( $output , ', ' );
$output .= ']';
return $output ;
}
function display_graph( $atts ){
$dataset = array( 'all' );
if( isset( $atts['dataset'] ) )
$dataset = $atts['dataset']; // string
$dataset = array( 'date' , 'cac-40' , 'marches-actions' , 'fonds-en-euros'
);
$output = '';
// $graph_type = 'ScatterChart';
$graph_type = 'LineChart';
$data = get_performances_graph_data();
// debug_var( $data );
$data_values = $data['values']; // Contains the dataset
$data_kpis = $data['kpis']; // Contains each KPI's ID
$ticks_string = get_ticks( $data_values );
$options = "
chartArea: {
width: '90%'
},
// pointSize: 1,
legend:{
maxLines: 3,
position: 'top',
textStyle: {
fontSize: 15
}
},
hAxis: {
fontSize: 10,
format: 'MMM y',
gridlines: {
color: '#eaeaea',
count: 15
},
ticks: $ticks_string,
},
crosshair: {
trigger: 'selection',
orientation: 'vertical',
color: '#143278',
}
";
$output .= '<div id="chart_div"></div>';
$output .= '
<script type="text/javascript"
src="https://www.google.com/jsapi?autoload={\'modules\':[{\'name\':\'visualization\',\'version\':\'1.1\',\'packages\':[\'corechart\']}]}"></script>
<script>
google.load("visualization", "1", {packages:["corechart"]});
google.setOnLoadCallback(drawChart);
function drawChart() {
var data = new google.visualization.DataTable();' . "\n";
foreach( $data_kpis as $d ){
$output .= "data.addColumn('" . $d['format'] . "', '" . $d['label'] .
"');\n";
}
// $rows = "\ndata.addRows([\n";
$rows = '';
foreach( $data_values as $d ){
// $row = "[";
$row = "\ndata.addRow([";
foreach( $data_kpis as $k ){
$slug = $k['slug'];
$val = $d[$slug];
// debug_var( $val );
if( isset( $k['format'] ) && $k['format'] == 'date' ){
$row .= "$val,\n";
}
else{
if( !isset( $val ) )
$val = "''";
$row .= "// $slug\n$val, \n";
// $row .= "$val,\n";
}
}
// $rows .= rtrim( rtrim( $row , ',') , ",\n") . "],\n";
$rows .= rtrim( rtrim( $row , ',') , ",\n") . "]);\n";
}
// $output .= rtrim( rtrim( $rows , ',') , ",\n") . "]);\n";
$output .= rtrim( rtrim( $rows , ',') , ",\n") . "\n";
$output .= '
var options = {' . $options . '};
var chart = new google.visualization.' . $graph_type .
'(document.getElementById(\'chart_div\'));
chart.draw(data, options);
var columns = [];
var series = {};
for (var i = 0; i < data.getNumberOfColumns(); i++) {
// HERE, I need to select which column is in $dataset (if $dataset
!= array("all")) and hide the rest
columns.push(i);
if (i > 0) {
series[i - 1] = {};
}
}
console.dir(series);
console.dir(columns);
var options = {
series: series,
' . $options . '
}
var view = new google.visualization.DataView(data);
view.setColumns(columns);
chart.draw(view, options);
google.visualization.events.addListener(chart, \'select\', function () {
var sel = chart.getSelection();
// if selection length is 0, we deselected an element
if (sel.length > 0) {
// if row is undefined, we clicked on the legend
if (sel[0].row === null) {
var col = sel[0].column;
if (columns[col] == col) {
// hide the data series
columns[col] = {
label: data.getColumnLabel(col),
type: data.getColumnType(col),
calc: function () {
return null;
}
};
// grey out the legend entry
series[col - 1].color = \'#CCCCCC\';
}
else {
// show the data series
columns[col] = col;
series[col - 1].color = null;
}
var view = new google.visualization.DataView(data);
view.setColumns(columns);
chart.draw(view, options);
console.log( series );
console.log( columns );
}
}
});
}</script>
';
return $output;
}
My function is parsing an array called $dataset. The default value is
"all", but I've added a small line of code in order to test with a pattern
that could be parsed in the future.
$dataset = array( 'date' , 'cac-40' , 'marches-actions' , 'fonds-en-euros' );
As you can see in my code, at some point I get arrays of series and columns
:
var columns = [];
var series = {};
for (var i = 0; i < data.getNumberOfColumns(); i++) {
// HERE, I need to select which column is in $dataset (if $dataset
!= array("all")) and hide the rest
columns.push(i);
if (i > 0) {
series[i - 1] = {};
}
}
console.dir(series);
console.dir(columns);
At the end of the script, I have a loop that hides/shows columns on click
event :
google.visualization.events.addListener(chart, \'select\', function () {
var sel = chart.getSelection();
// if selection length is 0, we deselected an element
if (sel.length > 0) {
// if row is undefined, we clicked on the legend
if (sel[0].row === null) {
var col = sel[0].column;
if (columns[col] == col) {
// hide the data series
columns[col] = {
label: data.getColumnLabel(col),
type: data.getColumnType(col),
calc: function () {
return null;
}
};
// grey out the legend entry
series[col - 1].color = \'#CCCCCC\';
}
else {
// show the data series
columns[col] = col;
series[col - 1].color = null;
}
var view = new google.visualization.DataView(data);
view.setColumns(columns);
chart.draw(view, options);
console.log( series );
console.log( columns );
}
}
});
This is the part where I'm lost.
I was thinking that where I get the first set of series and columns, I
could hide some of them either by looping within them and checking against
the &atts['dataset'] parameter or maybe changing them directly using the
index.
Thank you very much for your help and time !
Greg
--
You received this message because you are subscribed to the Google Groups
"Google Visualization API" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/google-visualization-api.
To view this discussion on the web visit
https://groups.google.com/d/msgid/google-visualization-api/8e8c9657-b029-4bf6-885c-ac2350fef94b%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.