3min

De grafiek zelf

Als laatste is het nodig de grafiek zelf te tekenen. Oplettende lezers merken waarschijnlijk op, waar wordt het verticale raster getekend? Dat gebeurt tegelijkertijd. Elke lijn in het raster is ook een plek waar een punt in de grafiek zit. Het wordt een lijngrafiek wanneer deze punten met een lijn met elkaar worden verbonden.

Om een lijn te tekenen moet natuurlijk een begincoördinaat en een eindcoördinaat worden gebruikt. Het begincoördinaat kan het eindcoördinaat van het vorige punt zijn, op die manier wordt elk punt al aan elkaar verbonden. Hier bij moet het eerst punt dus worden overgeslagen, aangezien je altijd het vorige punt met het huidige punt verbindt. Bij het eerste punt is geen vorige punt.

De code voor het weergeven van de grafiek ziet er als volgt uit:
PHP Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// De gegevens plotten.
$punt_nummer = 0;
 
$previous_x = -1;
$previous_y = -1;
 
foreach ($gegevens AS $punt => $waarde)
{
	// Het laatste punt moet precies op de rechter lijn vallen. Vandaar count($gegevens) - 1
	$x = $rand_links + $grafiek_breedte * $punt_nummer/(count($gegevens) - 1);
	$y = $rand_boven + $grafiek_hoogte * ( 1 - ($waarde-$y_min) / ($y_max - $y_min) );
 
	// Lijn verbinden met het vorige punt.
	if ($previous_x != -1 && $previous_y != -1)
		imageline($graph, $x, $y, $previous_x, $previous_y, $line);
 
	// Label tekenen.
	$tekst_grootte = imagettfbbox(10, 90, "verdana.TTF", $punt);
 
	$tekst_breedte = $tekst_grootte[4]+$tekst_grootte[0];
	$tekst_hoogte =  $tekst_grootte[1]-$tekst_grootte[3];
 
	imagettftext($graph, 10, 90, $x-$tekst_breedte/2, $hoogte - $rand_onder + $tekst_hoogte +3, $black, "verdana.TTF", $punt);
	imageline($graph, $x, $rand_boven, $x, $hoogte-$rand_onder, $raster);
 
	// Hulpvariabelen bijhouden.
	$previous_x = $x;
	$previous_y = $y;
	$punt_nummer++;
 
}

Er worden hier drie hulpvariabelen gebruikt. Punt_nummer geeft aan bij welk punt we zijn in de grafiek. Previous_x en previous_y (vorige X en vorige Y) geven aan op welk coördinaat het vorige punt lag. Deze is later uiteraard weer nodig. Om elk punt langs te gaan kan in dit geval een foreach loop worden gebruikt.

Als eerst wordt altijd het coördinaat van het punt uitgerekend. De y-waarde is identiek aan de berekening van het raster. De x-waarde is berekend volgens hetzelfde principe. De waarde ligt altijd binnen de grafiek;,dus met de breedte van omlijsting aan de linkerkant naar rechts verschoven. Vervolgens wordt bepaald in welk deel het punt zich van het geheel bevindt (bijvoorbeeld op de helft). Dat deel wordt vermenigvuldigd met de breedte.

Nadat de coördinaten zijn bepaald kan de lijn meteen worden getekend tussen het vorige punt en het huidige punt. Hier bij moet wel worden gecontroleerd of het vorige punt bestaat. De variabelen previous_x en previous_y staan standaard op -1. Die controle voldoet prima om te kijken of het eerste punt geweest is. Later worden beide variabelen toch overschreven.

Vervolgens wordt het label weer getekend. Dit gaat volgens hetzelfde principe als bij het horizontale raster tekenen. Dit is uiteraard voor het verticale raster. Het kan lijken alsof het raster na de lijn wordt getekend. In principe is dat zo, maar de lijn naar het volgende punt tekent weer over het raster heen. Dat heft elkaar uiteindelijk op. De labels zijn in dit geval ook 90 graden gedraaid, vandaar er bij het derde argument van imagettftext 90 wordt opgegeven.