3min

Het eindresultaat

Na deze laatste stap is het script klaar. Uiteraard moet de grafiek nog wel worden weergegeven door gebruik te maken van imagepng:

PHP Code

1
2
3
4
5
6
<?php
// Weergeef de grafiek.
header("Content-type: image/png");
imagepng($graph);
imagedestroy($graph);
?>

Hierbij wordt ook de header content-type gewijzigd. Normaal is die text/html, maar omdat we een plaatje meesturen verandert de gemaakte inhoud. Het is tevens ook mogelijk om het plaatje weg te schrijven naar een bestand. Daarvoor breid je imagepng uit naar imagepng($graph, "grafiek.png&quot;);. De header meesturen is niet nodig, er wordt dan namelijk geen grafiek op het scherm weergegeven.

De grafiek van dit script ziet er als volgt uit. Deze is natuurlijk aan te passen in de desbetreffende variabelen die eerder besproken zijn:

En de code:

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
<?php
 
$breedte = 450;
$hoogte = 300;
 
$rand_links = 40;
$rand_boven = 15;
$rand_rechts = 12;
$rand_onder = 40;
 
$gegevens = array(
	'Jan' => 30,
	'Feb' => 23,
	'Mar' => 40,
	'Apr' => 38,
	'May' => 50,
	'Jun' => 65,
	'Jul' => 79,
	'Aug' => 81,
	'Sep' => 58,
	'Oct' => 43,
	'Nov' => 36,
	'Dec' => 32
);
 
// Maak het object aan voor het plaatje.
$graph = imagecreatetruecolor($breedte, $hoogte);
 
// Definieer standaard kleuren.
$white = imagecolorallocate($graph,255,255,255);
$black = imagecolorallocate($graph,0,0,0);
$line = imagecolorallocate($graph,255,0,0);
$gray = imagecolorallocate($graph,230,230,230);
$border = imagecolorallocate($graph, 140, 50, 50);
$raster = imagecolorallocate($graph, 230,230,230);
 
// Vul de achtergrond op naar wit.
imagefill($graph, 0,0, $white);
 
// Teken de omlijsting
$punten =  array(
	0,0,
	0,$hoogte,
	$breedte, $hoogte,
	$breedte, 0,
	$rand_links,0,
	$rand_links, $rand_boven,
	$breedte-$rand_rechts, $rand_boven,
	$breedte-$rand_rechts, $hoogte-$rand_onder,
	$rand_links, $hoogte-$rand_onder,
	$rand_links, 0
);
imagefilledpolygon($graph, $punten, count($punten)/2, $gray);
 
// Teken ruimte uitrekenen..
$grafiek_breedte = $breedte-$rand_links-$rand_rechts;
$grafiek_hoogte = $hoogte-$rand_onder-$rand_boven;
 
// Schaalverdeling berekeningen.
$y_max = max($gegevens);
$y_min = min($gegevens);
 
$y_stap = ceil( ($y_max - $y_min)/10);
$y_max = $y_min + 10 * $y_stap;
 
 
// Teken links de waarde labels + horizontaal raster.
for ($waarde = $y_min; $waarde <= $y_max; $waarde += $y_stap)
{
	$y = $rand_boven + $grafiek_hoogte * ( 1 - ($waarde-$y_min) / ($y_max - $y_min) );
	imageline($graph, $rand_links, $y, $breedte-$rand_rechts, $y, $raster);
 
	$tekst_grootte = imagettfbbox(10, 0, "verdana.TTF", $waarde);
 
	$tekst_breedte = $tekst_grootte[4]+$tekst_grootte[0];
	$tekst_hoogte =  0-$tekst_grootte[5];
 
	imagettftext($graph, 10, 0, $rand_links-$tekst_breedte-8, $y + $tekst_hoogte/2, $black, "verdana.TTF", round($waarde,1));
}
 
// 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++;
 
}
 
// Teken tenslotte de binnenrand (dit komt over het raster)
imagerectangle($graph, $rand_links, $rand_boven, $breedte-$rand_rechts, $hoogte-$rand_onder, $border);
 
// Weergeef de grafiek.
header("Content-type: image/png");
imagepng($graph);
imagedestroy($graph);
 
?>