Jetzt neu: Handgebundene Tagebücher und Notizhefte by Unkelbach Art Handgebundene Notizhefte

Gesundheitliche Gründe zwingen - und bringen(!) - mich zu Veränderungen, die so nie geplant waren: Statt mit Variablen, Schleifen und Abfragen, arbeite ich jetzt mit wundervollem Papier: hauchdünnes Transparentpapier, mattweißes Schreibpapier, rustikales Kraftpapier, flexibler, schwarzer Karton, feste Graupappe und viele mehr. Aus allen entstehen handgebundene Notizbücher, Tagebücher und Notizhefte, die schon beim Ansehen Freude machen - stellt euch mal vor, wie toll es ist, auch noch darin zu schreiben!

PHP für dich bleibt euch natürlich in seiner aktuellen Form erhalten und vielleicht sehen wir uns ja mal bei Unkelbach Art, auf Facebook oder Instagram oder ihr holt euch eines meiner Produkte. Es wäre mir eine große Freude!
Mehr dazu...

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


Spenden via PayPal
© 2001 - 2020 Claudia Unkelbach
Gießener Straße 75, 35396 Gießen