Tällä hetkellä saa vain tehtyä ympyrädiagrammeja, mutta tarkoitus olisi
tehdä pylväs -ja viivadiagrammit kunhan ehtii. Kommentteja on runsaan
puoleisesti ja jotkut niistä ehkä hieman turhiakin :)
<?php /* * Tämä on luokka, jolla voit luoda erilaisia diagrammeja * Koodannut Joni Järvinen (Jope) <jope@psykoosi.org> * * Koodi on vapaasti käytettävissä ja muokattavissa kunhan * tekijän nimi säilyy. * */ class diagram { // Funktio, joka lähettää headerin function Headers () { header ("Content-type: image/png"); } // Random luku funktio function RandomNum ($min, $max) { // Alustetaan random luku generaattori mt_srand((double) microtime() * 1000000 ^ getmypid()); // Arvotaan luku $number = mt_rand($min, $max); // Palautetaan luku return $number; } /* * Funktio, joka luo ymprädiagrammin ja tulostaa sen haluttaessa * * function CreatePie (Array data, String otsikko, String yksikkö [, Bool tulostus]) * * Funktion ensimmäinen parametri sisältää datan muodossa: * * Array ( * [0] => Array ( * String asia1, Float arvo [, Int red [, Int green [, Int Blue]]] * ), * [1] => Array ( * String asia2, Float arvo [, Int red [, Int green [, Int Blue]]] * ) * ) * * Toinen parametri sisältää Ympyrädiagrammin otsikon * * Kolmas parametri on yksikkö. Esim "%", "kg" tai " €" * * Neljäs parametri ei ole pakollinen, mutta jos arvoksi on laitettu * TRUE tulostetaan diagrammi suoraan; muuten palautetaan vain kuva * recource muuttujana. * * Data arrayssä kohtaan 'arvo' tulee esim 500 tai 45.9 ja sen jälkeen * voit määritellä RGB valuen minkä värinen asia on diagrammissa. Se * ei ole välttämätöntä, mutta suositeltavaa, sillä RGB valuet arvotaan * jos niitä ei ole määritelty, joka saattaa johtaa melkein samoihin * tai jopa täysin samoihin väreihin. * */ function CreatePie($data, $topic, $unit, $print = FALSE) { // Tarkistetaan, että tarvittava data on annettu if (is_array($data) AND sizeof($data) >= 1 AND $topic AND $unit) { // Luodaan kuva $image = ImageCreate(500, 300) or die("Asenna GD kirjasto!"); // Asetetaan taustaksi valkoinen $white = ImageColorAllocate ($image, 255, 255, 255); // Määritetään musta väri $black = ImageColorAllocate ($image, 0, 0, 0); // Määritetään harmaa väri $gray = ImageColorAllocate ($image, 221, 221, 221); // Piirretään kuvalle kehykset ImageRectangle ($image, 1, 1, ImageSX($image) - 1, ImageSY($image) - 1, $black); // Loopataan data läpi while (list($key, $val) = each($data)) { // Tarkastetaan onko $val array if (is_array($val)) { // Lasketaan kaikki arvot yhteen kulman laskemista varten $values += $val[1]; // Tarkastetaan onko käyttäjä määritellyt itse värin if (($val[2] >= 0 AND $val[2] <= 255 AND $val[2] != "") AND ($val[3] >= 0 AND $val[3] <= 255 AND $val[3] != "") AND ($val[4] >= 0 AND $val[4] <= 255 AND $val[4] != "")) { // Jos on määritellään uusi väri $data[$key][5] = ImageColorAllocate ($image, $val[2], $val[3], $val[4]); } else { // Jos ei niin määritellään random väri $data[$key][5] = ImageColorAllocate ($image, $this->RandomNum(0, 255), $this->RandomNum(0, 255), $this->RandomNum(0, 255)); } } else { // Jos $val ei ole array niin tulee virheilmoitus die ("Data taulukon arvon tyyppi ei kelpaa!"); } } // Piirretään otsikko ImageString ($image, 5, floor((ImageSX($image) / 2) - ((ImageFontWidth(5) * strlen($topic)) / 2)), 10, $topic, $black); // Piirretään boksi minne selitykset tulevat ImageRectangle ($image, ImageSX($image) - 230, 60, ImageSX($image) - 20, 60 + (sizeof($data) * ImageFontHeight(2)) + 16, $black); // Täytetään boksi harmaalla ImageFilledRectangle ($image, ImageSX($image) - 229, 61, ImageSX($image) - 21, 60 + (sizeof($data) * ImageFontHeight(2)) + 15, $gray); // Loopataan data läpi ja piirretään ympyrän osat ja selitykset väreille for ($i = 0; $i < sizeof($data); $i++) { // Lasketaan loppu kulma $end_angle = $data[$i][1] / $values * 360; // Piirretään slaissi lisää tietoja funktiosta: https://www.php.net/ImageFilledArc ImageFilledArc ($image, 125, 155, 200, 200, $start_angle, $start_angle + $end_angle, $data[$i][5], IMG_ARC_PIE); // Lisätään aloitus kulmaan lopetus kulma $start_angle += $end_angle; // Piirretään neliö, ja sen viereen selitys, mitä se väri tarkoittaa ImageRectangle ($image, ImageSX($image) - 221, ImageFontHeight(2) * $i + 5 + 66, ImageSX($image) - 214, ImageFontHeight(2) * $i + 10 + 68, $black); ImageFilledRectangle ($image, ImageSX($image) - 220, ImageFontHeight(2) * $i + 5 + 67, ImageSX($image) - 215, ImageFontHeight(2) * $i + 10 + 67, $data[$i][5]); ImageString ($image, 2, ImageSX($image) - 210, ImageFontHeight(2) * $i + 5 + 63, $data[$i][0] . " (" . $data[$i][1] . $unit . ")", $black); } // Piirretään ääriviivat ympyrälle ImageArc ($image, 125, 155, 200, 200, 0, 360, $black); // Piirretään yhteensä teksti ImageString ($image, 2, floor((ImageSX($image) / 2) - ((ImageFontWidth(2) * strlen("Yhteensä: " . $values . $unit)) / 2)), ImageSY($image) - 25, "Yhteensä: " . $values . $unit, $black); // Tarkastetaan haluaako käyttäjä tulostaa kuvan suoraan if (!$print) { // Jos ei, pelautetaan kuva vain resource muuttujana return $image; } // Jos haluaa niin lähetetään headerit $this->Headers(); // Tulostetaan kuva ImagePng ($image); // Ja vapautetaan muistia tuhoamalla kuva ImageDestroy ($image); } else { die ("Ei tarpeeksi parametrejä"); } } } ?> Esimerkki: <?php $data = Array ( // RGB valuet voi jättää pois, mutta silloin värit arvotaan Array ("Assembly", 11, 190, 200, 250), Array ("C", 44, 190, 250, 200), Array ("C++", 37, 70, 110, 70), Array ("Delphi", 51, 240, 170, 240), Array ("Java", 16, 100, 50, 100), Array ("Perl", 17, 240, 250, 180), Array ("PHP", 152, 90, 100, 150), Array ("Visual Basic", 17, 250, 170, 170), Array ("Muut", 35, 120, 120, 120) ); $img = new diagram; $img->CreatePie($data, "Koodikirjaston jakauma", " kpl", TRUE); ?> Esimerkkiä voi tarkastella täällä: http://koti.mbnet.fi/jonij/Diagrammi%20luokka.php
Hmm.. Ei sitä satunnaislukugeneraattoria sentään joka kerta tarvitse alustaa. ;-)
Juu, ei tarvitse, eikä saa. Vähentää satunnaisuutta.
Unohtui sanoa, että muuten ihan ok vinkki.
Satunnaislukugeneraattori kannattaisi varmaan alustaa aina samalla arvolla, muutoin peräkkäin piirretty sama kuva vaihtaa värejä joka latauskerralla!
Aihe on jo aika vanha, joten et voi enää vastata siihen.