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

  1. <?php
  2. define('APP_DIR', dirname(__FILE__));
  3. define('TMP_DIR', APP_DIR . 'tmp/');
  4. define('CONFIG_DIR', APP_DIR . 'config/');
  5. define('LIB_DIR', APP_DIR . 'lib/');
  6. define('JPGRAPH_DIR', LIB_DIR . 'jpgraph/');
  7. define('TTF_DIR', LIB_DIR . 'fonts/');
  8.  
  9. // Knihovna PEAR::DB pro získání dat z databáze
  10. require_once 'DB.php';
  11. // Vlastní knihovna JpGraph
  12. require_once (JPGRAPH_DIR . 'jpgraph.php');
  13.  
  14. // Dotaz na jednotlivé společnosti a sumaci jejich objednávek pro tento rok
  15. $sql = 'SELECT c.companyname,
  16. (SELECT CASE WHEN SUM(oi.itemdefaultunitprice*oi.itemquantity) IS NULL
  17. THEN 0 ELSE SUM(oi.itemdefaultunitprice*oi.itemquantity) END AS suma
  18. FROM orders AS o INNER JOIN orderitems AS oi ON o.orderid = oi.itemorder
  19. AND year(o.ordercreatedate) = year(NOW())
  20. AND o.ordercompany = c.companyid) AS total
  21. FROM companies c ORDER BY total DESC';
  22.  
  23. // Databáze běží na PostgreSQL
  24. $db =& DB::connect('pgsql://karel:password@localhost/test');
  25. if (PEAR::isError($db)) {
  26. die($db->getMessage());
  27. }
  28. $data =& $db-&gt;getAll($sql, array(), DB_FETCHMODE_OBJECT);
  29. if (PEAR::isError($data)) {
  30. die($data->getMessage());
  31. }
  32.  
  33. foreach($data as $item) {
  34. $company[] = $item->companyname;
  35. $orders[] = $item->total;
  36. }
  37.  
  38. // Nastavení rozměrů grafu
  39. $line_height = 20;
  40. $top = 80;
  41. $bottom = 80;
  42. $left = 180;
  43. $right = 20;
  44. $graph_height = $line_height*sizeof($company);
  45. $graph_width = 300;
  46. $height = $top + $graph_height + $bottom;
  47. $width = $graph_width + $left + $right;
  48.  
  49. // Vlastní vykreslení grafu
  50. $graph = new Graph($width,$height,'auto');
  51. $graph->SetScale("textlin");
  52.  
  53. // Otočíme osy o 90°
  54. $graph->Set90AndMargin($left,$right,$top,$bottom);
  55.  
  56. // Použijeme stíny
  57. $graph->SetShadow();
  58.  
  59. // Nastavíme titulek
  60. $graph->title->Set("Objednávky společnosti pro tento rok");
  61. $graph->title->SetFont(FF_ARIAL,FS_BOLD,14);
  62.  
  63. // Nastavíme osu X
  64. $graph->xaxis->SetTickLabels($company);
  65. $graph->xaxis->SetFont(FF_ARIAL,FS_BOLD,8);
  66.  
  67. // Zvětšime odstup
  68. $graph->xaxis->SetLabelMargin(5);
  69.  
  70. // Zarovnáme popisky na ose X
  71. $graph->xaxis->SetLabelAlign('right','center');
  72.  
  73. // Nastavíme osy Y
  74. $graph->yaxis->scale->SetGrace(20);
  75. $graph->yaxis->SetLabelAlign('center','bottom');
  76. $graph->yaxis->SetLabelAngle(45);
  77. $graph->yaxis->SetLabelFormat('%d');
  78. $graph->yaxis->SetFont(FF_ARIAL,FS_NORMAL,8);
  79.  
  80. // Vytvořímě sloupcový graf
  81. $bplot = new BarPlot($orders);
  82. $bplot->SetFillColor("red");
  83. $bplot->setValuePos("bottom");
  84. $bplot->value->Show();
  85. $bplot->value->SetFont(FF_ARIAL,FS_BOLD,8);
  86. $bplot->value->SetAlign('left','center');
  87. $bplot->value->SetColor("black","darkred");
  88. $bplot->value->SetFormat('%.2f Kč');
  89. $bplot->SetWidth(0.8);
  90.  
  91. // Přidáme sloupcový graf do kontejneru grafů k vykreslení
  92. $graph->Add($bplot);
  93.  
  94. // Na záver vykreslíme všechny grafy z kontejneru
  95. $graph->Stroke();
  96. ?>

Použití

<img src="bargraph.php" title="Graf výsledku" />

A jak na to teď koukám .... pokračování příště.