Gràfiques amb Javascript: http://www.highcharts.com/

De wikijoan
La revisió el 15:34, 23 maig 2013 per Joan (discussió | contribucions) (Es crea la pàgina amb «=Introducció= *http://www.highcharts.com/ *http://www.highcharts.com/demo Highcharts és una llibreria de Javascript potent, amb la qual es poden fer gràfiques dinàmiq...».)
(dif) ← Versió més antiga | Versió actual (dif) | Versió més nova → (dif)
Salta a la navegació Salta a la cerca

Introducció

Highcharts és una llibreria de Javascript potent, amb la qual es poden fer gràfiques dinàmiques de moltes menes com es pot veure en les demostracions.

En aquesta pràctica farem una gràfica recuperant dades d'una base de dades.

Desenvolupament

generar_fotos_stats.php:

<?php
/*
mysql> select left(nom_fitxer,4) as anymes,count(*) as num from FOTO where (nom_fitxer like '12%' or nom_fitxer like '13%') group by anymes
    -> ;
+--------+-----+
| anymes | num |
+--------+-----+
| 1203   |  33 |
| 1204   | 193 |
| 1205   | 220 |
| 1206   |  26 |
| 1207   | 277 |
| 1208   |  73 |
| 1209   |  33 |
| 1210   | 106 |
| 1301   |   4 |
+--------+-----+

*/

include("open_db.php");
$myFile = "fotos_stats.json";
$fh = fopen($myFile, 'w') or die("can't open file");
$sql = "select left(nom_fitxer,4) as anymes,count(*) as num from FOTO where (nom_fitxer like '12%' or nom_fitxer like '13%') group by anymes";

$result = mysql_query($sql);

if (!$result) {
    $message  = 'Invalid query: ' . mysql_error() . "\n";
    die($message);
}

$dades0 = "";
$dades1 = "";

while ($row = mysql_fetch_assoc($result)) {
	$dades0 .= $row['anymes'];
	$dades0 .= ",";
	$dades1 .= $row['num'];
	$dades1 .= ",";
	$i++;
}

$dades0 = substr($dades0,0,strlen($dades0)-1);
$dades1 = substr($dades1,0,strlen($dades1)-1);

$dades = $dades0 . "*" . $dades1;
echo $dades;

include("close_db.php");

?>

El script anterior el que fa és preparar les dades (eix x i eix y) que es veuran a la gràfica. Les dades es separen per comes, i les dades de l'eix x i l'eix y es separen amb el caràcter comodí *. Aquesta informació s'enviarà amb una crida AJAX en el script següent.

stats_insectes.html:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "xhtml11.dtd">

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

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>

<script type="text/javascript">
var example = 'line-basic',
	theme = 'default';
</script>

<script type="text/javascript" src="/demo/scripts.js"></script>

<script type="text/javascript">

(function($){ // encapsulate jQuery

$(function () {

	$("#container2").load("generar_fotos_stats.php",function(responseTxt,statusTxt,xhr){
		if(statusTxt=="success")
		//alert("External content loaded successfully!");
		//alert(responseTxt);

		var dades = responseTxt.split("*");

		var dades0 = dades[0].split(","); 
		var dades1 = dades[1].split(","); 

		for(var i=0;i<dades1.length;i++){
			dades1[i] = parseInt(dades1[i]);
		}

		// define the options
		var options = {
			chart: {
				type: 'line'
			},
			title: {
				text: 'Insectes stats'
			},
			xAxis: {
				title: {
				text: 'mes-any'
				},
				categories: dades0
			},
			yAxis: [{ // left y axis
				title: {
					text: 'num. insectes'
				},
				labels: {
					align: 'left',
					x: 3,
					y: 16,
					formatter: function() {
						return Highcharts.numberFormat(this.value, 0);
					}
				},
				showFirstLabel: false
				}, { // right y axis
				linkedTo: 0,
					gridLineWidth: 0,
					opposite: true,
					title: {
						text: null
					},
					labels: {
						align: 'right',
						x: -3,
						y: 16,
						formatter: function() {
							return Highcharts.numberFormat(this.value, 0);
						}
					},
				showFirstLabel: false
			}],
			plotOptions: {
				area: {
					marker: {
						enabled: false,
						symbol: 'circle',
						radius: 2,
						states: {
							hover: {
								enabled: true
							}
						}
					}
				}
			},
			legend: {
				enabled: false
			},
			series: [{
				name: 'num_insectes',
			}]
		};

		options.series[0].data = dades1;

		$('#container').highcharts(options);

		if(statusTxt=="error")
		alert("Error: "+xhr.status+": "+xhr.statusText);
	});

	});

})(jQuery);
</script>

</head>
<body>

<h1>Highcharts - Base de dades</h1>


<script src="http://code.highcharts.com/highcharts.js"></script>
<script src="http://code.highcharts.com/modules/exporting.js"></script>

<div id="container" style="min-width: 400px; height: 400px; margin: 0 auto"></div>
<div id="container2" style="min-width: 400px; height: 400px; margin: 0 auto"></div>

</body>
</html>

Fem una crida AJAX (amb JQuery) al fitxer generar_fotos_stats.php. Les dades obtingudes es fiquen en dues matrius: dades0[] que representa l'exi X, i dades1[] que representa l'eix Y. Les matrius s'aconsegueixen amb la funció split().

El quid del problema és entendre bé la funcionalitat de les gràfiques, i definir bé la variable options que és molt potent. El millor és mirar diferents demos a la pàgina web i quedar-se amb la més correcta.


creat per Joan Quintana Compte, maig 2013