JpGraph - knihovna pro kreslení grafů
Jelikož někteří z nás potřebují k pochopení statistických dat jejich grafické vyjádření pomocí grafu, jsme nuceni nějakým způsobem generovat grafy. V PHP máme možnost jejich generování pomocí standardní knihovny GD2. Bohužel poskytuje tato knihovna jen základní možnosti pro kreslení grafiky, proto je vhodné využít některou z již vytvořených knihoven.
Pro vykreslování grafů je možné využít knihovnu JpGraph od Švédské firmy Aditus. Velkou nevýhodou této jinak skvělé knihovny je její licence. Bohužel pro vývojáře komerčních projektů je tato knihovna distribuována pod licencí QPL, což eliminuje její využití, případně nutnost zakoupení verze JpGraph Professional Version.
Následující kód by měl vykreslit sloupcový graf cen objednávek klientů pro tento rok.
bargraph.php
<?php define('APP_DIR', dirname(__FILE__)); define('TMP_DIR', APP_DIR . 'tmp/'); define('CONFIG_DIR', APP_DIR . 'config/'); define('LIB_DIR', APP_DIR . 'lib/'); define('JPGRAPH_DIR', LIB_DIR . 'jpgraph/'); define('TTF_DIR', LIB_DIR . 'fonts/'); // Knihovna PEAR::DB pro získání dat z databáze require_once 'DB.php'; // Vlastní knihovna JpGraph require_once (JPGRAPH_DIR . 'jpgraph.php'); // Dotaz na jednotlivé společnosti a sumaci jejich objednávek pro tento rok $sql = 'SELECT c.companyname, (SELECT CASE WHEN SUM(oi.itemdefaultunitprice*oi.itemquantity) IS NULL THEN 0 ELSE SUM(oi.itemdefaultunitprice*oi.itemquantity) END AS suma FROM orders AS o INNER JOIN orderitems AS oi ON o.orderid = oi.itemorder AND year(o.ordercreatedate) = year(NOW()) AND o.ordercompany = c.companyid) AS total FROM companies c ORDER BY total DESC'; // Databáze běží na PostgreSQL $db =& DB::connect('pgsql://karel:password@localhost/test'); if (PEAR::isError($db)) { die($db->getMessage()); } $data =& $db->getAll($sql, array(), DB_FETCHMODE_OBJECT); if (PEAR::isError($data)) { die($data->getMessage()); } foreach($data as $item) { $company[] = $item->companyname; $orders[] = $item->total; } // Nastavení rozměrů grafu $line_height = 20; $top = 80; $bottom = 80; $left = 180; $right = 20; $graph_height = $line_height*sizeof($company); $graph_width = 300; $height = $top + $graph_height + $bottom; $width = $graph_width + $left + $right; // Vlastní vykreslení grafu $graph = new Graph($width,$height,'auto'); $graph->SetScale("textlin"); // Otočíme osy o 90° $graph->Set90AndMargin($left,$right,$top,$bottom); // Použijeme stíny $graph->SetShadow(); // Nastavíme titulek $graph->title->Set("Objednávky společnosti pro tento rok"); $graph->title->SetFont(FF_ARIAL,FS_BOLD,14); // Nastavíme osu X $graph->xaxis->SetTickLabels($company); $graph->xaxis->SetFont(FF_ARIAL,FS_BOLD,8); // Zvětšime odstup $graph->xaxis->SetLabelMargin(5); // Zarovnáme popisky na ose X $graph->xaxis->SetLabelAlign('right','center'); // Nastavíme osy Y $graph->yaxis->scale->SetGrace(20); $graph->yaxis->SetLabelAlign('center','bottom'); $graph->yaxis->SetLabelAngle(45); $graph->yaxis->SetLabelFormat('%d'); $graph->yaxis->SetFont(FF_ARIAL,FS_NORMAL,8); // Vytvořímě sloupcový graf $bplot = new BarPlot($orders); $bplot->SetFillColor("red"); $bplot->setValuePos("bottom"); $bplot->value->Show(); $bplot->value->SetFont(FF_ARIAL,FS_BOLD,8); $bplot->value->SetAlign('left','center'); $bplot->value->SetColor("black","darkred"); $bplot->value->SetFormat('%.2f Kč'); $bplot->SetWidth(0.8); // Přidáme sloupcový graf do kontejneru grafů k vykreslení $graph->Add($bplot); // Na záver vykreslíme všechny grafy z kontejneru $graph->Stroke(); ?>
Použití
<img src="bargraph.php" title="Graf výsledku" />
A jak na to teď koukám .... pokračování příště.