Qualcuno ha mai creato grafici "google chart" collegati a database mysql?

samurai.sette

Utente Attivo
17 Dic 2015
235
6
18
Ciao a tutti.

Come da titolo mi chiedevo se qualcuno avesse mai realizzato grafici "google chart" collegati a database mysql.
Io ne ho realizzati diversi e fin qui nessun problema; il problema è nato quando ho deciso di evolvere i grafici inserendo al loro interno i "Controls and Dashboards". Con questi ultimi ho la possibilità di interagire con il grafico senza dover aggiornare la pagina.

Il problema è questo: quando carico la pagina il grafico mi mostra tutti i punti presenti nel database mysql (fin qui tutto OK); nella pagina è presente un bottone chiamato "Select range [12, 15]" e se lo clicco, il grafico mi dovrebbe essere ricostruito dal punto 12 al punto 15. Se tra il punto 12 e il punto 15 è presente un valore inferiore a 12 o superiore a 15, questo mi viene escluso dal grafico che mi andrà a ricostruire. Di conseguenza il grafico che ottengo è sbagliato perché mancano molti punti esclusi.

Secondo voi dove può essere il problema? Nella query?

Inserisco il codice php
PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>Dashboards</title>
</head>

<body>

<?php

// connessione al server ed al database

  $con = mysql_connect ("localhost", "root","password") or die ("Connessione al server fallita!!!".mysql_error()); 
   
  $db = mysql_select_db ("database", $con); 
   
  if (!$db) 
  { 
    die ("Connessione al database fallita!!!".mysql_errore()); 
  }

  $sth = mysql_query ("SELECT * FROM tabella");
  
  $rows = array();

//flag is not needed
  $flag = true;
  $table = array();

// "COSTRUISCO" INDICANDO I NOMI DELLE COLONNE DELLA TABELLA - UNA DEVE ESSERE IN FORMATO STRINGA E UNA IN FORMATO NUMBER

  $table['cols'] = array(
    
    array('label' => 'id', 'type' => 'string'),
    array('label' => 'lettura', 'type' => 'number')
 
);

  $rows = array();
 
    while($r = mysql_fetch_assoc($sth))
    {
      $temp = array();

      $temp[] = array('v' => (string) $r['id']); 
      $temp[] = array('v' => (float) $r['lettura']);
      $rows[] = array('c' => $temp);
    }
 
  $table['rows'] = $rows;
  $jsonTable = json_encode($table);

?>

<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
    <script type="text/javascript">
      google.charts.load('current', {'packages':['corechart', 'controls']});
      google.charts.setOnLoadCallback(drawStuff);

      function drawStuff() {

        var dashboard = new google.visualization.Dashboard(
          document.getElementById('programmatic_dashboard_div'));

        // We omit "var" so that programmaticSlider is visible to changeRange.
        programmaticSlider = new google.visualization.ControlWrapper({
          'controlType': 'NumberRangeFilter',
          'containerId': 'programmatic_control_div',
          'options': {
            'filterColumnLabel': 'lettura',
            'ui': {'labelStacking': 'vertical'}
          }
        });

       programmaticChart  = new google.visualization.ChartWrapper({
        'chartType': 'LineChart',
        'containerId': 'programmatic_chart_div',
        'options': {
          'width': 700,
          'height': 500,
          'legend': 'none',
          'chartArea': {'left': 15, 'top': 15, 'right': 0, 'bottom': 0},
          'pieSliceText': 'value'
        }
      });
  
      var data = new google.visualization.DataTable(<?=$jsonTable?>);
      
      dashboard.bind(programmaticSlider, programmaticChart);
      dashboard.draw(data);
    }

    </script>

    <div id="programmatic_dashboard_div" style="border: 1px solid #ccc">
      <table class="columns">
        <tr>
          <td>
            <div id="programmatic_control_div" style="padding-left: 2em; min-width: 250px"></div>
            <div>
              <button style="margin: 1em 1em 1em 3em" onclick="changeRange();">
                Select range [12, 15]
              </button><br/>
            </div>
            <script type="text/javascript">
              function changeRange() {
                programmaticSlider.setState({'lowValue': 12, 'highValue': 15});
                programmaticSlider.draw();
              }
            </script>
          </td>
          <td>
            <div id="programmatic_chart_div"></div>
          </td>
        </tr>
      </table>
    </div>

</body>

</html>
 
"Select range [12, 15]" e se lo clicco, il grafico mi dovrebbe essere ricostruito dal punto 12 al punto 15. Se tra il punto 12 e il punto 15 è presente un valore inferiore a 12 o superiore a 15, questo mi viene escluso dal grafico che mi andrà a ricostruire. Di conseguenza il grafico che ottengo è sbagliato perché mancano molti punti esclusi.

io uso Highcharts, ma credo che ciò che descrivi prescinde dal software,

l'asse delle ascisse ha valori monotòni quindi ciò che hai scritto deve funzionare perché evidenzi una parte dell'asse

l'asse delle ordinate riporta valori, permettimi, casuali, quindi non vale quanto hai scritto

su quale asse poni il filtro ?
 
Ciao marino51, grazie per la risposta. Francamente non ho ben capito ciò che mi hai scritto.

Da quello che ho capito mi chiedi su quale asse applico il "filtro". Se è questo quello che mi chiedi lo applico sull'asse delle ascisse.
Scusa ma il resto non l'ho proprio capito. Potresti rispiegarmelo usando altre parole?

Ciao, grazie.
 
il grafico mi dovrebbe essere ricostruito dal punto 12 al punto 15. Se tra il punto 12 e il punto 15 è presente un valore inferiore a 12 o superiore a 15, questo mi viene escluso dal grafico che mi andrà a ricostruire

il filtro lo applico sull'asse delle ascisse

sull'asse delle ascisse, i valori sono continuamente crescenti o decrescenti, indipendentemente dalla scala (a meno che il grafico abbia assi scambiati)

quindi non dovresti avere
inferiore a 12 o superiore a 15
nell'intervallo che stai considerando
 
Ciao Marino51. Ho riletto il mio post di apertura e credo di non essermi spiegato bene, per cui ti faccio un esempio pratico.

Sull'asse x ho riportato il valore "LETTURA" e la scala va da 1 a 14 mentre sull'asse y ho riportato il valore "TEMPERATURA" e la scala va da 10° a 17°.
All'apertura della pagina il grafico mi viene costruito correttamente con tutte le 14 letture della temperatura.
Quando clicco sul bottone "Select range [12, 15]" mi deve ricostruire il grafico dalla temperatura di 12° alla temperatura di 15° includendo tutti i valori compresi nel range. Il grafico lo ricostruisce ma se, ad esempio, tra il range [12, 15] c'è una temperatura di 10° o 16°, questi vengono esclusi dal grafico. Questo non va bene, nel range [12, 15] mi deve considerare tutti i valori altrimenti il grafico è sbagliato.

Ciao
 
ti sei sempre spiegato benissimo, ciò che hai scritto nel primo post è esattamente quello che ripeti nell'ultimo,
penso che escludendo i valori eccedenti i due limiti, il grafico sia corretto,

potremmo discutere se, non rappresentando i punti esclusi, l'asse delle ascisse subisce alterazioni (valori intermedi omessi), ma se l'asse delle ascisse dovesse mantenere la continuità, credo che il grafico sia corretto

paradossalmente se il primo valore di temperatura fosse 12 e l'ultimo 15, con i tuo ragionamento, il grafico non cambierebbe con l'attivazione del filtro
 
Ciao marino51.

Per quanto riguarda il primo punto del tuo ultimo post l'asse delle ascisse mantiene la continuità e di conseguenza il grafico senza i punti esclusi è "corretto" (se così possiamo dire...).

Per quanto riguarda l'altro punto invece ti sbagli. Se inizialmente tra la temperatura di 12° e quella di 15° ci sono ad esempio 7 letture, in origine mi disegna un grafico con un certo andamento; se clicco "Select range [12, 15]" e mi elimina ad esempio 3 letture l'andamento del grafico è completamente diverso dal precedente.

Detto questo sai dove posso intervenire per evitare che vengano eliminate le letture?

Ciao, grazie.
 
Per quanto riguarda l'altro punto invece ti sbagli. Se inizialmente tra la temperatura di 12° e quella di 15° ci sono ad esempio 7 letture, in origine mi disegna un grafico con un certo andamento; se clicco "Select range [12, 15]" e mi elimina ad esempio 3 letture l'andamento del grafico è completamente diverso dal precedente.
la mia idea è in accordo con il risultato che ottieni, ma perché diversa dalla tua non è necessariamente sbagliata
Detto questo sai dove posso intervenire per evitare che vengano eliminate le letture?
no, probabilmente altri possano suggerire soluzioni proficue
ciao

scusa se mi sono permesso di intervenire senza una soluzione
 

Discussioni simili