Derzeit online: ca. 88 User  
Spenden via PayPal PHP für dich ist auch als Buch erhältlich - im handlichen Format, zum Nachschlagen, Mitnehmen oder gemütlichen nebenbei Lesen. Mit noch mehr Informationen, zusätzlichen Beispielen und Übungsaufgaben.
Jetzt in der aktualisierten Version bei Amazon oder BoD bestellen!


Schnipsel

PHP - Ein Kreisdiagramm mit gd-lib und festen Farben erzeugen

Wie beim ursprünglichen Kreisdiagramm angesprochen, verursacht die dort verwendete Farbauswahl gewisse Probleme, da die Farben abgestufte Versionen eines Farbtons sind. Möchte man die Farben bereits vorher festlegen, so eignet sich dieser modifizierte Code - aber Achtung, man muss jede Farbe händisch anlegen und wenn man zu wenige Farben angelegt hat, wird der Rest der Felder einfach schwarz eingefärbt.

Bitte lies dir zuerst die grundsätzliche Erklärung zum Kreisdiagramm durch; ich erkläre hier nur noch die Unterschiede bzw. Neuerungen.

Der Code wird mit Zeilennummern angegeben, diese gehören nicht zum eigentlichen Code, sondern dienen lediglich der besseren Orientierung.

Das fertige Diagramm wird so aussehen:



Um diese festen Farben zu bekommen und das Diagramm dennoch über eine foreach-Schleife erstellen zu lassen, müssen wir nur wenige Stellen am Code ändern. Zunächst müssen wir statt der ursprünglich festgelegten Basisfarbe und dem Wert für die Abstufung dieser Farbe, unsere Farben festlegen. Dafür verändern wir die Zeilen 21 bis 24 im ursprünglichen Code. Aus...
  1. $r = 0;
  2. $g = 45;
  3. $b = 45;
  4. $farbabstufung = 40;
... wird dann...
  1. $color1 = imagecolorallocate($diagramm, 255, 69, 0);
  2. $color2 = imagecolorallocate($diagramm, 255, 215, 0);
  3. $color3 = imagecolorallocate($diagramm, 0, 191, 255);
  4. $color4 = imagecolorallocate($diagramm, 154, 205, 50);
Jede Farbe wird extra über die Funktion imagecolorallocate angelegt und bekommt als Variablennamen "color" sowie eine fortlaufende Zahl, beginnend bei 1. Das hilft uns später, die aktuelle Farbe über die Zählvariable $i anzusprechen. Für dieses Beispiel habe ich vier Farben angelegt. Hat man mehr Werte muss man entsprechend mehr Farben anlegen.

Die zweite Änderung erfolgt in der foreach-Schleife:
  1. foreach($werte as $key => $value)
  2. {
  3. $i++;
  4. $start = $winkel;
  5. $winkel = $start + $value*360/$gesamt;
  6.  
  7. $color = "color".$i;
  8.  
  9. imagefilledarc($diagramm, $start_x, $start_y, $radius, $radius, $start, $winkel, $$color, IMG_ARC_PIE);
  10.  
  11. $unterkante = $rand_oben+$punktbreite+($i-1)*($punktbreite+$abstand);
  12. imagefilledrectangle($diagramm, $rand_links, $rand_oben+($i-1)*($punktbreite+$abstand), $rand_links+$punktbreite, $unterkante, $$color);
  13. imagettftext($diagramm, $schriftgroesse, 0, $rand_links+$punktbreite+5, $unterkante-$punktbreite/2+$schriftgroesse/2, $schwarz, "media/arial.ttf", $key." ".round($value*100/$gesamt, 0)." %");
  14. }
Zunächst sparen wir uns das Festlegen einer neuen Farbe in der Variable $color, da wir die Farben bereits vorher definiert haben. Wir weisen dieser Variable jedoch einen Wert zu. Der Wert setzt sich zusammen aus dem Wort "color" und der Variable $i, die sich mit jedem Schleifendurchlauf erhöht. In der ersten Runde hat die Variable $color also den Wert "color1", in der zweiten Runde "color2" usw. Das entspricht dem Namen, den wir unseren Farbvariablen weiter oben gegeben haben.

Um diese Farbvariablen jetzt ansprechen zu können, arbeiten wir im weiteren Verlauf mit variablen Variablen. Wir rufen also eine Variable auf, deren Name sich erst innerhalb der Schleife ergibt. Dafür verändern wir die Zeilen 40 und 43 entsprechend und nehmen als Farbangabe $$color. Das erste Dollarzeichen ist der Aufruf der Variable, das zweite Dollarzeichen ist der Beginn der Variable, deren Wert an dieser Stelle eingesetzt werden soll. Das hintere $color wird also ersetzt durch das, was wir in Zeile 38 in die Variable geschrieben haben, sprich "color1", "color2" usw. Dadurch interpretiert PHP es schließlich als $color1, $color2 usw. und setzt korrekt die oben festgelegten Farben ein.

Das ist auch schon die ganze Hexerei. Hier der gesamte Code in der Übersicht, die Veränderungen habe ich hervorgehoben:
  1. <?php
  2. $werte = array("Katze" => 40, "Hund" => 65, "Nagetier" => 12, "Sonstiges" => 13);
  3.  
  4. $breite = 400;
  5. $hoehe = 300;
  6. $radius = 200;
  7. $start_x = ($breite/3)*2;
  8. $start_y = $hoehe/2;
  9.  
  10. $rand_oben = 20;
  11. $rand_links = 20;
  12. $punktbreite = 10;
  13. $abstand = 10;
  14. $schriftgroesse = 10;
  15.  
  16. $diagramm = imagecreatetruecolor($breite, $hoehe);
  17.  
  18. $schwarz = imagecolorallocate($diagramm, 0, 0, 0);
  19. $weiss = imagecolorallocate($diagramm, 255, 255, 255);
  20.  
  21. $color1 = imagecolorallocate($diagramm, 255, 69, 0);
  22. $color2 = imagecolorallocate($diagramm, 255, 215, 0);
  23. $color3 = imagecolorallocate($diagramm, 0, 191, 255);
  24. $color4 = imagecolorallocate($diagramm, 154, 205, 50);
  25.  
  26. imagefill($diagramm, 0, 0, $weiss);
  27.  
  28. $i = 0;
  29. $winkel = 0;
  30. arsort($werte);
  31. $gesamt = array_sum($werte);
  32. foreach($werte as $key => $value)
  33. {
  34. $i++;
  35. $start = $winkel;
  36. $winkel = $start + $value*360/$gesamt;
  37.  
  38. $color = "color".$i;
  39.  
  40. imagefilledarc($diagramm, $start_x, $start_y, $radius, $radius, $start, $winkel, $$color, IMG_ARC_PIE);
  41.  
  42. $unterkante = $rand_oben+$punktbreite+($i-1)*($punktbreite+$abstand);
  43. imagefilledrectangle($diagramm, $rand_links, $rand_oben+($i-1)*($punktbreite+$abstand), $rand_links+$punktbreite, $unterkante, $$color);
  44. imagettftext($diagramm, $schriftgroesse, 0, $rand_links+$punktbreite+5, $unterkante-$punktbreite/2+$schriftgroesse/2, $schwarz, "arial.ttf", $key." ".round($value*100/$gesamt, 0)." %");
  45. }
  46. imagepng($diagramm, "kreisdiagramm.png");
  47. ?>


Autor: Claudia Unkelbach
© 2001 - 2017 Claudia Unkelbach
Gießener Straße 75, 35396 Gießen