Diagrams

This script allows to generate pie charts and bar diagrams

Informations

Author: Pierre Marletta
License: FPDF

Description

This script allows to generate pie charts and bar diagrams. It uses the Sector script.

PieChart(float w, float h, array data, string format [, array colors])

w: maximum width of the diagram.
h: maximum height of the diagram.
data: associative array containing the labels and the corresponding data.
format: format used to display the legends. It is a string which can contain the following special values: %l (label), %v (value) and %p (percentage).
colors: array containing the colors. If not given, a grayscale will be used.

BarDiag(float w, float h, array data, string format [, array couleur [, int maxVal [, int nbDiv]]])

w: width of the diagram.
h: height of the diagram.
data: associative array containing the labels and the corresponding data.
format: format used to display the legends. It is a string which can contain the following special values: %l (label), %v (value) and %p (percentage).
color: color of the bars. If not given, gray will be used.
maxVal: high value of the scale. Defaults to the maximum value of the data.
nbDiv: number of subdivisions of the scale (4 by default).

Source

<?php require('sector.php'); class PDF_Diag extends PDF_Sector { var $legends; var $wLegend; var $sum; var $NbVal; function PieChart($w, $h, $data, $format, $colors=null) { $this->SetFont('Courier', '', 10); $this->SetLegends($data, $format); $XPage = $this->GetX(); $YPage = $this->GetY(); $margin = 2; $hLegend = 5; $radius = min($w - $margin * 4 - $hLegend - $this->wLegend, $h - $margin * 2); $radius = floor($radius / 2); $XDiag = $XPage + $margin + $radius; $YDiag = $YPage + $margin + $radius; if($colors == null) { for($i = 0; $i < $this->NbVal; $i++) { $gray = $i * intval(255 / $this->NbVal); $colors[$i] = array($gray, $gray, $gray); } } //Sectors $this->SetLineWidth(0.2); $angleStart = 0; $angleEnd = 0; $i = 0; foreach($data as $val) { $angle = ($val * 360) / doubleval($this->sum); if ($angle != 0) { $angleEnd = $angleStart + $angle; $this->SetFillColor($colors[$i][0], $colors[$i][1], $colors[$i][2]); $this->Sector($XDiag, $YDiag, $radius, $angleStart, $angleEnd); $angleStart += $angle; } $i++; } //Legends $this->SetFont('Courier', '', 10); $x1 = $XPage + 2 * $radius + 4 * $margin; $x2 = $x1 + $hLegend + $margin; $y1 = $YDiag - $radius + (2 * $radius - $this->NbVal*($hLegend + $margin)) / 2; for($i=0; $i<$this->NbVal; $i++) { $this->SetFillColor($colors[$i][0], $colors[$i][1], $colors[$i][2]); $this->Rect($x1, $y1, $hLegend, $hLegend, 'DF'); $this->SetXY($x2, $y1); $this->Cell(0, $hLegend, $this->legends[$i]); $y1+=$hLegend + $margin; } } function BarDiagram($w, $h, $data, $format, $color=null, $maxVal=0, $nbDiv=4) { $this->SetFont('Courier', '', 10); $this->SetLegends($data, $format); $XPage = $this->GetX(); $YPage = $this->GetY(); $margin = 2; $YDiag = $YPage + $margin; $hDiag = floor($h - $margin * 2); $XDiag = $XPage + $margin * 2 + $this->wLegend; $lDiag = floor($w - $margin * 3 - $this->wLegend); if($color == null) $color=array(155, 155, 155); if ($maxVal == 0) { $maxVal = max($data); } $valIndRepere = ceil($maxVal / $nbDiv); $maxVal = $valIndRepere * $nbDiv; $lRepere = floor($lDiag / $nbDiv); $lDiag = $lRepere * $nbDiv; $unit = $lDiag / $maxVal; $hBar = floor($hDiag / ($this->NbVal + 1)); $hDiag = $hBar * ($this->NbVal + 1); $eBaton = floor($hBar * 80 / 100); $this->SetLineWidth(0.2); $this->Rect($XDiag, $YDiag, $lDiag, $hDiag); $this->SetFont('Courier', '', 10); $this->SetFillColor($color[0], $color[1], $color[2]); $i=0; foreach($data as $val) { //Bar $xval = $XDiag; $lval = (int)($val * $unit); $yval = $YDiag + ($i + 1) * $hBar - $eBaton / 2; $hval = $eBaton; $this->Rect($xval, $yval, $lval, $hval, 'DF'); //Legend $this->SetXY(0, $yval); $this->Cell($xval - $margin, $hval, $this->legends[$i], 0, 0, 'R'); $i++; } //Scales for ($i = 0; $i <= $nbDiv; $i++) { $xpos = $XDiag + $lRepere * $i; $this->Line($xpos, $YDiag, $xpos, $YDiag + $hDiag); $val = $i * $valIndRepere; $xpos = $XDiag + $lRepere * $i - $this->GetStringWidth($val) / 2; $ypos = $YDiag + $hDiag - $margin; $this->Text($xpos, $ypos, $val); } } function SetLegends($data, $format) { $this->legends=array(); $this->wLegend=0; $this->sum=array_sum($data); $this->NbVal=count($data); foreach($data as $l=>$val) { $p=sprintf('%.2f', $val/$this->sum*100).'%'; $legend=str_replace(array('%l', '%v', '%p'), array($l, $val, $p), $format); $this->legends[]=$legend; $this->wLegend=max($this->GetStringWidth($legend), $this->wLegend); } } } ?>

Example

<?php require('diag.php'); $pdf = new PDF_Diag(); $pdf->AddPage(); $data = array('Men' => 1510, 'Women' => 1610, 'Children' => 1400); //Pie chart $pdf->SetFont('Arial', 'BIU', 12); $pdf->Cell(0, 5, '1 - Pie chart', 0, 1); $pdf->Ln(8); $pdf->SetFont('Arial', '', 10); $valX = $pdf->GetX(); $valY = $pdf->GetY(); $pdf->Cell(30, 5, 'Number of men:'); $pdf->Cell(15, 5, $data['Men'], 0, 0, 'R'); $pdf->Ln(); $pdf->Cell(30, 5, 'Number of women:'); $pdf->Cell(15, 5, $data['Women'], 0, 0, 'R'); $pdf->Ln(); $pdf->Cell(30, 5, 'Number of children:'); $pdf->Cell(15, 5, $data['Children'], 0, 0, 'R'); $pdf->Ln(); $pdf->Ln(8); $pdf->SetXY(90, $valY); $col1=array(100, 100, 255); $col2=array(255, 100, 100); $col3=array(255, 255, 100); $pdf->PieChart(100, 35, $data, '%l (%p)', array($col1, $col2, $col3)); $pdf->SetXY($valX, $valY + 40); //Bar diagram $pdf->SetFont('Arial', 'BIU', 12); $pdf->Cell(0, 5, '2 - Bar diagram', 0, 1); $pdf->Ln(8); $valX = $pdf->GetX(); $valY = $pdf->GetY(); $pdf->BarDiagram(190, 70, $data, '%l : %v (%p)', array(255, 175, 100)); $pdf->SetXY($valX, $valY + 80); $pdf->Output(); ?>
View the result here.

Download

ZIP | TGZ

Quelle

http://www.fpdf.org/en/script/script28.php, zuletzt abgerufen 02.10.2016 09:57