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.phpHmm.. 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.