doditsuprianto
11-03-2008, 03:45 PM
Pie Chart adalah grafik yang berbentuk lingkaran dimana disetiap bagian memiliki warna sendiri-sendiri yang menunjukkan bahwa pada masing-masing bagian memiliki label sendiri-sendiri, dan besarnya area berdasarkan besarnya derajat yang mewakili prosentasi nilai/value dari setiap label. Grafik pie sering digunakan sebagai sarana untuk menampilkan data yang akan dipresentasikan.
Kali ini saya membuat class php untuk menampilkan grafik pie. Penggunaan class saya usahakan semudah mungkin penggunaannya. Anda tidak membutuhkan pengaturan yang cukup banyak. Anda cukup mengatur area kanvas, memberi nilai pada tiap label sebanyak Anda mau. Class pie chart yang saya buat ini akan secara otomatis menghitung ulang dan selalu menampilkan pie dalam kondisi yang proporsional. Class Pie Chart tersbut juga memiliki kelebihan lain, misalnya: Kita dapat menentukan ketebalannya, merubah jenis huruf title/judul pie chart dan legend (keterangan gambar), dll.
Class pie chart ini bisa Anda lekatkan denga data yang diperoleh dari database sehingga data yang akan ditampilkan jadi dinamis dan menarik.
Untuk lebih lengkapnya bisa dibaca di http://doditsuprianto.com (http://doditsuprianto.com)
<?php
/**
* @author Dodit Suprianto
* Email: d0dit@yahoo.com
* Website: http://www.meozit.com, http://doditsuprianto.com
*
* File name: pieChart.class.php
*
* Description:
* Custom pie chart is a class to generate your own pie chart. Easy to use and very simple.
* You don't need to configure very much. Just set a canvas area, set a value and description for an each pie slice,
* of course you should add other slices as you like. This pie chart will calculate and generate automatically for you.
* If need it you can also change the font style, color background and font color.
* This pie chart could be bind with your data for present a static data such as vooting, data visitor, and other purpose.
*
*/
class pieChart
{
private $canvasWidth;
private $canvasHeight;
private $tickness;
private $color = array();
private $image;
private $degree = array();
private $value = array();
private $description = array();
private $font;
private $fontcolor;
private $bgcolor;
private $bgR;
private $bgG;
private $bgB;
private $fontR;
private $fontG;
private $fontB;
private $title = array();
public function __construct($canvasWidth, $canvasHeight, $tickness)
{
$this->canvasWidth = $canvasWidth;
$this->canvasHeight = $canvasHeight;
$this->image = imagecreatetruecolor($this->canvasWidth, $this->canvasHeight);
$this->tickness = $tickness;
}
public function setTitle($title)
{
$this->title[] = $title;
}
public function setFontColor($fontcolor)
{
if ($fontcolor)
{
$this->fontcolor = imagecolorallocate($this->image, hexdec(substr(trim($fontcolor),1,2)), hexdec(substr(trim($fontcolor),3,2)), hexdec(substr(trim($fontcolor),5,2)));
} else {$this->fontcolor = imagecolorallocate($this->image, 0, 0, 0);}
}
public function setBGColor($bgcolor)
{
if ($bgcolor)
{
$this->bgR = hexdec(substr(trim($bgcolor), 1, 2));
$this->bgG = hexdec(substr(trim($bgcolor), 3, 2));
$this->bgB = hexdec(substr(trim($bgcolor), 5, 2));
$this->bgcolor = imagecolorallocate($this->image, hexdec(substr(trim($bgcolor),1,2)), hexdec(substr(trim($bgcolor),3,2)), hexdec(substr(trim($bgcolor),5,2)));
} else {$this->bgcolor = imagecolorallocate($this->image, 0, 0, 0);}
}
public function setFont($font)
{
$this->font = $font;
}
public function Tickness($tickness)
{
$this->tickness = $tickness;
}
private function pieSlice()
{
$total = 0;
for ($i=0; $i < count($this->value); $i++)
{
$total += $this->value[$i];
}
for ($i=0; $i < count($this->value); $i++)
{
$this->degree[$i] = $this->value[$i] / $total * 360;
$R = mt_rand(25,250);
$G = mt_rand(25,250);
$B = mt_rand(25,250);
$this->color["light"][$i] = imagecolorallocate($this->image, $R, $G, $B);
$this->color["dark"][$i] = imagecolorallocate($this->image, $R - 20, $G - 20, $B - 20);
}
}
public function setValue($description, $value)
{
$this->value[] = $value;
$this->description[] = $description;
}
public function showPie()
{
imagefill($this->image, 0, 0, imagecolorallocate($this->image, $this->bgR, $this->bgG, $this->bgB));
$pieX = ceil($this->canvasWidth / 2);
$pieY = ceil($this->canvasHeight / 2) - 60;
$this->pieSlice();
for ($i = $this->tickness + $pieY; $i > $pieY; $i--)
{
$start = 0;
for ($iterate=0; $iterate < count($this->value); $iterate++)
{
imagefilledarc($this->image, $pieX, $i, $this->canvasWidth - 50, ($this->canvasWidth - 50)/2, $start, $start + $this->degree[$iterate], $this->color["dark"][$iterate], IMG_ARC_PIE);
$start += $this->degree[$iterate];
}
}
$start = 0;
$x1 = 20;
$y1 = 0 + $this->canvasHeight * 2 / 3;
$x2 = 30;
$y2 = 10 + $this->canvasHeight * 2 / 3;
for ($iterate=0; $iterate < count($this->value); $iterate++)
{
imagefilledarc($this->image, $pieX, $pieY, $this->canvasWidth - 50, ($this->canvasWidth - 50)/2, $start, $start + $this->degree[$iterate], $this->color["light"][$iterate], IMG_ARC_PIE);
imagefilledrectangle($this->image, $x1, $y1, $x2, $y2, $this->color["light"][$iterate]);
imagettftext($this->image, 9, 0, $x2 + 5, $y2, $this->fontcolor, $this->font, $this->description[$iterate] . " = " . $this->value[$iterate]);
$start += $this->degree[$iterate];
$y1 += 15;
$y2 += 15;
}
$py = 30;
for ($i=0; $i<count($this->title); $i++)
{
$textbox = imagettfbbox(12, 0, $this->font, $this->title[$i]);
$px = ($this->canvasWidth - $textbox[4])/2;
$py = 30 + $i * 30;
imagettftext($this->image, 12, 0, $px, $py, $this->fontcolor, $this->font, $this->title[$i]);
}
header('Content-type: image/png');
imagepng($this->image);
simagedestroy($this->image);
}
}
$img = new pieChart(300, 430, 26);
$img->setFont("lsans.ttf");
$img->setValue("http://www.doditsuprianto.com", 56);
$img->setValue("http://www.meozit.com", 100);
$img->setValue("http://www.goiklan.com", 78);
$img->setValue("http://www.phpclasses.org", 190);
$img->setValue("http://www.hotscripts.com",120);
$img->setValue("http://www.google.com", 45);
$img->setBGColor("#001122");
$img->setFontColor("#FFFFFF");
$img->setTitle("FIRST TITLE ON THE FIRST LINE");
$img->setTitle("SECOND TITLE ON THE SECOND LINE");
$img->showPie();
?>
<html>
<head>
<title>Custom Pie Chart</title>
</head>
<body>
<table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="100%" id="AutoNumber1" height="295">
<tr>
<td width="100%" height="295">
<p align="center"><img src=pieChart.class.php></td>
</tr>
</table>
</body>
</html>
Kali ini saya membuat class php untuk menampilkan grafik pie. Penggunaan class saya usahakan semudah mungkin penggunaannya. Anda tidak membutuhkan pengaturan yang cukup banyak. Anda cukup mengatur area kanvas, memberi nilai pada tiap label sebanyak Anda mau. Class pie chart yang saya buat ini akan secara otomatis menghitung ulang dan selalu menampilkan pie dalam kondisi yang proporsional. Class Pie Chart tersbut juga memiliki kelebihan lain, misalnya: Kita dapat menentukan ketebalannya, merubah jenis huruf title/judul pie chart dan legend (keterangan gambar), dll.
Class pie chart ini bisa Anda lekatkan denga data yang diperoleh dari database sehingga data yang akan ditampilkan jadi dinamis dan menarik.
Untuk lebih lengkapnya bisa dibaca di http://doditsuprianto.com (http://doditsuprianto.com)
<?php
/**
* @author Dodit Suprianto
* Email: d0dit@yahoo.com
* Website: http://www.meozit.com, http://doditsuprianto.com
*
* File name: pieChart.class.php
*
* Description:
* Custom pie chart is a class to generate your own pie chart. Easy to use and very simple.
* You don't need to configure very much. Just set a canvas area, set a value and description for an each pie slice,
* of course you should add other slices as you like. This pie chart will calculate and generate automatically for you.
* If need it you can also change the font style, color background and font color.
* This pie chart could be bind with your data for present a static data such as vooting, data visitor, and other purpose.
*
*/
class pieChart
{
private $canvasWidth;
private $canvasHeight;
private $tickness;
private $color = array();
private $image;
private $degree = array();
private $value = array();
private $description = array();
private $font;
private $fontcolor;
private $bgcolor;
private $bgR;
private $bgG;
private $bgB;
private $fontR;
private $fontG;
private $fontB;
private $title = array();
public function __construct($canvasWidth, $canvasHeight, $tickness)
{
$this->canvasWidth = $canvasWidth;
$this->canvasHeight = $canvasHeight;
$this->image = imagecreatetruecolor($this->canvasWidth, $this->canvasHeight);
$this->tickness = $tickness;
}
public function setTitle($title)
{
$this->title[] = $title;
}
public function setFontColor($fontcolor)
{
if ($fontcolor)
{
$this->fontcolor = imagecolorallocate($this->image, hexdec(substr(trim($fontcolor),1,2)), hexdec(substr(trim($fontcolor),3,2)), hexdec(substr(trim($fontcolor),5,2)));
} else {$this->fontcolor = imagecolorallocate($this->image, 0, 0, 0);}
}
public function setBGColor($bgcolor)
{
if ($bgcolor)
{
$this->bgR = hexdec(substr(trim($bgcolor), 1, 2));
$this->bgG = hexdec(substr(trim($bgcolor), 3, 2));
$this->bgB = hexdec(substr(trim($bgcolor), 5, 2));
$this->bgcolor = imagecolorallocate($this->image, hexdec(substr(trim($bgcolor),1,2)), hexdec(substr(trim($bgcolor),3,2)), hexdec(substr(trim($bgcolor),5,2)));
} else {$this->bgcolor = imagecolorallocate($this->image, 0, 0, 0);}
}
public function setFont($font)
{
$this->font = $font;
}
public function Tickness($tickness)
{
$this->tickness = $tickness;
}
private function pieSlice()
{
$total = 0;
for ($i=0; $i < count($this->value); $i++)
{
$total += $this->value[$i];
}
for ($i=0; $i < count($this->value); $i++)
{
$this->degree[$i] = $this->value[$i] / $total * 360;
$R = mt_rand(25,250);
$G = mt_rand(25,250);
$B = mt_rand(25,250);
$this->color["light"][$i] = imagecolorallocate($this->image, $R, $G, $B);
$this->color["dark"][$i] = imagecolorallocate($this->image, $R - 20, $G - 20, $B - 20);
}
}
public function setValue($description, $value)
{
$this->value[] = $value;
$this->description[] = $description;
}
public function showPie()
{
imagefill($this->image, 0, 0, imagecolorallocate($this->image, $this->bgR, $this->bgG, $this->bgB));
$pieX = ceil($this->canvasWidth / 2);
$pieY = ceil($this->canvasHeight / 2) - 60;
$this->pieSlice();
for ($i = $this->tickness + $pieY; $i > $pieY; $i--)
{
$start = 0;
for ($iterate=0; $iterate < count($this->value); $iterate++)
{
imagefilledarc($this->image, $pieX, $i, $this->canvasWidth - 50, ($this->canvasWidth - 50)/2, $start, $start + $this->degree[$iterate], $this->color["dark"][$iterate], IMG_ARC_PIE);
$start += $this->degree[$iterate];
}
}
$start = 0;
$x1 = 20;
$y1 = 0 + $this->canvasHeight * 2 / 3;
$x2 = 30;
$y2 = 10 + $this->canvasHeight * 2 / 3;
for ($iterate=0; $iterate < count($this->value); $iterate++)
{
imagefilledarc($this->image, $pieX, $pieY, $this->canvasWidth - 50, ($this->canvasWidth - 50)/2, $start, $start + $this->degree[$iterate], $this->color["light"][$iterate], IMG_ARC_PIE);
imagefilledrectangle($this->image, $x1, $y1, $x2, $y2, $this->color["light"][$iterate]);
imagettftext($this->image, 9, 0, $x2 + 5, $y2, $this->fontcolor, $this->font, $this->description[$iterate] . " = " . $this->value[$iterate]);
$start += $this->degree[$iterate];
$y1 += 15;
$y2 += 15;
}
$py = 30;
for ($i=0; $i<count($this->title); $i++)
{
$textbox = imagettfbbox(12, 0, $this->font, $this->title[$i]);
$px = ($this->canvasWidth - $textbox[4])/2;
$py = 30 + $i * 30;
imagettftext($this->image, 12, 0, $px, $py, $this->fontcolor, $this->font, $this->title[$i]);
}
header('Content-type: image/png');
imagepng($this->image);
simagedestroy($this->image);
}
}
$img = new pieChart(300, 430, 26);
$img->setFont("lsans.ttf");
$img->setValue("http://www.doditsuprianto.com", 56);
$img->setValue("http://www.meozit.com", 100);
$img->setValue("http://www.goiklan.com", 78);
$img->setValue("http://www.phpclasses.org", 190);
$img->setValue("http://www.hotscripts.com",120);
$img->setValue("http://www.google.com", 45);
$img->setBGColor("#001122");
$img->setFontColor("#FFFFFF");
$img->setTitle("FIRST TITLE ON THE FIRST LINE");
$img->setTitle("SECOND TITLE ON THE SECOND LINE");
$img->showPie();
?>
<html>
<head>
<title>Custom Pie Chart</title>
</head>
<body>
<table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="100%" id="AutoNumber1" height="295">
<tr>
<td width="100%" height="295">
<p align="center"><img src=pieChart.class.php></td>
</tr>
</table>
</body>
</html>