858 lines
25 KiB
PHP
858 lines
25 KiB
PHP
<?php
|
|
|
|
// mPDF 4.5.009
|
|
define("FF_USERFONT", 15); // See jpgraph_ttf.inc.php for font IDs
|
|
global $JpgUseSVGFormat;
|
|
$JpgUseSVGFormat = true;
|
|
|
|
//======================================================================================================
|
|
// DELETE OLD GRAPH FILES FIRST - Housekeeping
|
|
// First clear any files in directory that are >1 hrs old
|
|
$interval = 3600;
|
|
if ($handle = opendir(_MPDF_PATH . 'graph_cache')) {
|
|
while (false !== ($file = readdir($handle))) {
|
|
if (((filemtime(_MPDF_PATH . 'graph_cache/' . $file) + $interval) < time()) && ($file != "..") && ($file != ".")) {
|
|
@unlink(_MPDF_PATH . 'graph_cache/' . $file); // mPDF 4.0
|
|
}
|
|
}
|
|
closedir($handle);
|
|
}
|
|
//==============================================================================================================
|
|
// LOAD GRAPHS
|
|
|
|
include_once(_JPGRAPH_PATH . 'jpgraph.php');
|
|
include_once(_JPGRAPH_PATH . 'jpgraph_line.php' );
|
|
include_once(_JPGRAPH_PATH . 'jpgraph_log.php' );
|
|
include_once(_JPGRAPH_PATH . 'jpgraph_scatter.php' );
|
|
include_once(_JPGRAPH_PATH . 'jpgraph_regstat.php' );
|
|
include_once(_JPGRAPH_PATH . 'jpgraph_pie.php');
|
|
include_once(_JPGRAPH_PATH . 'jpgraph_pie3d.php');
|
|
include_once(_JPGRAPH_PATH . 'jpgraph_bar.php');
|
|
include_once(_JPGRAPH_PATH . 'jpgraph_radar.php');
|
|
|
|
require_once __DIR__ . '/MpdfException.php';
|
|
|
|
function print_graph($g, $pgwidth)
|
|
{
|
|
$splines = false;
|
|
$bandw = false;
|
|
$percent = false;
|
|
$show_percent = false;
|
|
$stacked = false;
|
|
$h = false;
|
|
$show_values = false;
|
|
$hide_grid = false;
|
|
$hide_y_axis = false;
|
|
|
|
if (isset($g['attr']['TYPE']) && $g['attr']['TYPE']) {
|
|
$type = strtolower($g['attr']['TYPE']);
|
|
}
|
|
if (!in_array($type, array('bar', 'horiz_bar', 'line', 'radar', 'pie', 'pie3d', 'xy', 'scatter'))) {
|
|
$type = 'bar';
|
|
} // Default=bar
|
|
|
|
if (isset($g['attr']['STACKED']) && $g['attr']['STACKED']) {
|
|
$stacked = true;
|
|
} // stacked for bar or horiz_bar
|
|
if (isset($g['attr']['SPLINES']) && $g['attr']['SPLINES'] && $type == 'xy') {
|
|
$splines = true;
|
|
} // splines for XY line graphs
|
|
if (isset($g['attr']['BANDW']) && $g['attr']['BANDW']) {
|
|
$bandw = true;
|
|
} // black and white
|
|
if (isset($g['attr']['LEGEND-OVERLAP']) && $g['attr']['LEGEND-OVERLAP']) {
|
|
$overlap = true;
|
|
} // avoid overlap of Legends over graph (line, bar, horiz_bar only)
|
|
if (isset($g['attr']['PERCENT']) && $g['attr']['PERCENT'] && $type != 'xy' && $type != 'scatter') {
|
|
$percent = true;
|
|
} // Show data series as percent of total in series
|
|
if (isset($g['attr']['SHOW-VALUES']) && $g['attr']['SHOW-VALUES']) {
|
|
$show_values = true;
|
|
} // Show the individual data values
|
|
if (isset($g['attr']['HIDE-GRID']) && $g['attr']['HIDE-GRID']) {
|
|
$hide_grid = true;
|
|
} // Hide the y-axis gridlines
|
|
if (isset($g['attr']['HIDE-Y-AXIS']) && $g['attr']['HIDE-Y-AXIS']) {
|
|
$hide_y_axis = true;
|
|
} // Hide the y-axis
|
|
// Antialias: If true - better quality curves, but graph line will only be 1px even in PDF 300dpi
|
|
// default=true for most except line and radar
|
|
if (isset($g['attr']['ANTIALIAS']) && ($g['attr']['ANTIALIAS'] == '' || $g['attr']['ANTIALIAS'] == 0)) {
|
|
$antialias = false;
|
|
} else if (isset($g['attr']['ANTIALIAS']) && $g['attr']['ANTIALIAS'] > 0) {
|
|
$antialias = true;
|
|
} else if ($type == 'line' || $type == 'radar') {
|
|
$antialias = false;
|
|
} else {
|
|
$antialias = true;
|
|
}
|
|
|
|
if ($g['attr']['DPI']) {
|
|
$dpi = intval($g['attr']['DPI']);
|
|
}
|
|
if (!$dpi || $dpi < 50 || $dpi > 2400) {
|
|
$dpi = 150;
|
|
} // Default dpi 150
|
|
$k = (0.2645 / 25.4 * $dpi);
|
|
|
|
// mPDF 4.5.009
|
|
global $JpgUseSVGFormat;
|
|
if (isset($JpgUseSVGFormat) && $JpgUseSVGFormat) {
|
|
$img_type = 'svg';
|
|
$k = 1; // Overrides as Vector scale does not need DPI
|
|
} else {
|
|
$img_type = 'png';
|
|
}
|
|
|
|
if (isset($g['attr']['TITLE']) && $g['attr']['TITLE']) {
|
|
$title = $g['attr']['TITLE'];
|
|
}
|
|
|
|
if (isset($g['attr']['LABEL-X']) && $g['attr']['LABEL-X']) {
|
|
$xlabel = $g['attr']['LABEL-X'];
|
|
} // NOT IMPLEMENTED??????
|
|
if (isset($g['attr']['LABEL-Y']) && $g['attr']['LABEL-Y']) {
|
|
$ylabel = $g['attr']['LABEL-Y'];
|
|
}
|
|
|
|
if (isset($g['attr']['AXIS-X']) && $g['attr']['AXIS-X']) {
|
|
$xaxis = strtolower($g['attr']['AXIS-X']);
|
|
}
|
|
if (!in_array($xaxis, array('text', 'lin', 'linear', 'log'))) {
|
|
$xaxis = 'text';
|
|
} // Default=text
|
|
if ($xaxis == 'linear') {
|
|
$xaxis = 'lin';
|
|
}
|
|
|
|
if (isset($g['attr']['AXIS-Y']) && $g['attr']['AXIS-Y']) {
|
|
$yaxis = strtolower($g['attr']['AXIS-Y']);
|
|
}
|
|
if (!in_array($yaxis, array('lin', 'linear', 'log', 'percent'))) {
|
|
$yaxis = 'lin';
|
|
} // Default=lin
|
|
if ($yaxis == 'percent') {
|
|
$show_percent = true;
|
|
$yaxis = 'lin';
|
|
} // Show percent sign on scales
|
|
if ($yaxis == 'linear') {
|
|
$yaxis = 'lin';
|
|
}
|
|
|
|
if ($splines) {
|
|
$xaxis = 'lin';
|
|
}
|
|
$axes = $xaxis . $yaxis; // e.g.textlin, textlog, loglog, loglin, linlog (XY)
|
|
// mPDF 4.0
|
|
if (isset($g['attr']['cWIDTH']) && $g['attr']['cWIDTH']) {
|
|
$w = ($g['attr']['cWIDTH'] / 0.2645);
|
|
} // pixels
|
|
if (isset($g['attr']['cHEIGHT']) && $g['attr']['cHEIGHT']) {
|
|
$h = ($g['attr']['cHEIGHT'] / 0.2645);
|
|
}
|
|
|
|
|
|
if (isset($g['attr']['SERIES']) && strtolower($g['attr']['SERIES']) == 'rows') {
|
|
$dataseries = 'rows';
|
|
} else {
|
|
$dataseries = 'cols';
|
|
}
|
|
|
|
// Defaults - define data
|
|
$rowbegin = 2;
|
|
$colbegin = 2;
|
|
if ($type == 'scatter' || $type == 'xy') {
|
|
if ($dataseries == 'rows') {
|
|
$rowbegin = 1;
|
|
} else {
|
|
$colbegin = 1;
|
|
}
|
|
}
|
|
$rowend = 0;
|
|
$colend = 0;
|
|
|
|
if (isset($g['attr']['DATA-ROW-BEGIN']) && ($g['attr']['DATA-ROW-BEGIN'] === '0' || $g['attr']['DATA-ROW-BEGIN'] > 0)) {
|
|
$rowbegin = $g['attr']['DATA-ROW-BEGIN'];
|
|
}
|
|
|
|
if (isset($g['attr']['DATA-COL-BEGIN']) && ($g['attr']['DATA-COL-BEGIN'] === '0' || $g['attr']['DATA-COL-BEGIN'] > 0)) {
|
|
$colbegin = $g['attr']['DATA-COL-BEGIN'];
|
|
}
|
|
|
|
if (isset($g['attr']['DATA-ROW-END']) && ($g['attr']['DATA-ROW-END'] === '0' || $g['attr']['DATA-ROW-END'] <> 0)) {
|
|
$rowend = $g['attr']['DATA-ROW-END'];
|
|
}
|
|
if (isset($g['attr']['DATA-COL-END']) && ($g['attr']['DATA-COL-END'] === '0' || $g['attr']['DATA-COL-END'] <> 0)) {
|
|
$colend = $g['attr']['DATA-COL-END'];
|
|
}
|
|
|
|
$nr = count($g['data']);
|
|
$nc = 0;
|
|
foreach ($g['data'] AS $r) {
|
|
$cc = 0;
|
|
foreach ($r AS $c) {
|
|
$cc++;
|
|
}
|
|
$nc = max($nc, $cc);
|
|
}
|
|
if ($colend == 0) {
|
|
$colend = $nc;
|
|
} else if ($colend < 0) {
|
|
$colend = $nc + $colend;
|
|
}
|
|
|
|
if ($rowend == 0) {
|
|
$rowend = $nr;
|
|
} else if ($rowend < 0) {
|
|
$rowend = $nr + $rowend;
|
|
}
|
|
|
|
if ($colend < $colbegin) {
|
|
$colend = $colbegin;
|
|
}
|
|
if ($rowend < $rowbegin) {
|
|
$rowend = $rowbegin;
|
|
}
|
|
|
|
// if ($type == 'xy' || $type=='scatter') { $colstart=0; }
|
|
// Get Data + Totals
|
|
$data = array();
|
|
$totals = array();
|
|
for ($r = ($rowbegin - 1); $r < $rowend; $r++) {
|
|
for ($c = ($colbegin - 1); $c < $colend; $c++) {
|
|
if (isset($g['data'][$r][$c])) {
|
|
$g['data'][$r][$c] = floatval($g['data'][$r][$c]);
|
|
} else {
|
|
$g['data'][$r][$c] = 0;
|
|
}
|
|
if ($dataseries == 'rows') {
|
|
$data[($r + 1 - $rowbegin)][($c + 1 - $colbegin)] = $g['data'][$r][$c];
|
|
$totals[($r + 1 - $rowbegin)] += $g['data'][$r][$c];
|
|
} else {
|
|
$data[($c + 1 - $colbegin)][($r + 1 - $rowbegin)] = $g['data'][$r][$c];
|
|
if (isset($totals[($c + 1 - $colbegin)])) {
|
|
$totals[($c + 1 - $colbegin)] += $g['data'][$r][$c];
|
|
} else {
|
|
$totals[($c + 1 - $colbegin)] = $g['data'][$r][$c];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// PERCENT
|
|
if ($percent && $type != 'pie' && $type != 'pie3d') {
|
|
for ($r = 0; $r < count($data); $r++) {
|
|
for ($c = 0; $c < count($data[$r]); $c++) {
|
|
$data[$r][$c] = $data[$r][$c] / $totals[$r] * 100;
|
|
}
|
|
}
|
|
}
|
|
// Get Legends and labels
|
|
$legends = array();
|
|
$labels = array();
|
|
$longestlegend = 0;
|
|
$longestlabel = 0;
|
|
if ($dataseries == 'cols') {
|
|
if ($colbegin > 1) {
|
|
for ($r = ($rowbegin - 1); $r < $rowend; $r++) {
|
|
$legends[($r + 1 - $rowbegin)] = $g['data'][$r][0];
|
|
$longestlegend = max($longestlegend, strlen($g['data'][$r][0]));
|
|
}
|
|
}
|
|
if ($rowbegin > 1) {
|
|
for ($c = ($colbegin - 1); $c < $colend; $c++) {
|
|
$labels[($c + 1 - $colbegin)] = $g['data'][0][$c];
|
|
$longestlabel = max($longestlabel, strlen($g['data'][0][$c]));
|
|
}
|
|
}
|
|
} else if ($dataseries == 'rows') {
|
|
if ($colbegin > 1) {
|
|
for ($r = ($rowbegin - 1); $r < $rowend; $r++) {
|
|
$labels[($r + 1 - $rowbegin)] = $g['data'][$r][0];
|
|
$longestlabel = max($longestlabel, strlen($g['data'][$r][0]));
|
|
}
|
|
}
|
|
if ($rowbegin > 1) {
|
|
for ($c = ($colbegin - 1); $c < $colend; $c++) {
|
|
$legends[($c + 1 - $colbegin)] = $g['data'][0][$c];
|
|
$longestlegend = max($longestlegend, strlen($g['data'][0][$c]));
|
|
}
|
|
}
|
|
}
|
|
// Default sizes
|
|
$defsize = array();
|
|
$defsize['pie'] = array('w' => 600, 'h' => 300);
|
|
$defsize['pie3d'] = array('w' => 600, 'h' => 300);
|
|
$defsize['radar'] = array('w' => 600, 'h' => 300);
|
|
$defsize['line'] = array('w' => 600, 'h' => 400);
|
|
$defsize['xy'] = array('w' => 600, 'h' => 400);
|
|
$defsize['scatter'] = array('w' => 600, 'h' => 400);
|
|
$defsize['bar'] = array('w' => 600, 'h' => 400);
|
|
$defsize['horiz_bar'] = array('w' => 600, 'h' => 500);
|
|
|
|
|
|
// Use default ratios
|
|
if ($w && !$h) {
|
|
$h = $w * $defsize[$type]['h'] / $defsize[$type]['w'];
|
|
}
|
|
if ($h && !$w) {
|
|
$w = $h * $defsize[$type]['w'] / $defsize[$type]['h'];
|
|
}
|
|
if (!$h && !$w) {
|
|
$w = $defsize[$type]['w'];
|
|
$h = $defsize[$type]['h'];
|
|
}
|
|
|
|
|
|
if (count($data) > 0 && $type) {
|
|
$figure_file = "graph_cache/" . rand(11111, 999999999) . "." . $img_type;
|
|
if ($bandw) {
|
|
$colours = array('snow1', 'black', 'snow4', 'snow3', 'snow2', 'cadetblue4', 'cadetblue3', 'cadetblue1', 'bisque4', 'bisque2', 'beige');
|
|
} else {
|
|
$colours = array('cyan', 'darkorchid4', 'cadetblue3', 'khaki1', 'darkolivegreen2', 'cadetblue4', 'coral', 'cyan4', 'rosybrown3', 'wheat1');
|
|
}
|
|
$fills = array('navy', 'orange', 'red', 'yellow', 'purple', 'navy', 'orange', 'red', 'yellow', 'purple');
|
|
$patterns = array(PATTERN_DIAG1, PATTERN_CROSS1, PATTERN_STRIPE1, PATTERN_DIAG3, PATTERN_CROSS2, PATTERN_DIAG2, PATTERN_DIAG4, PATTERN_CROSS3, PATTERN_CROSS4, PATTERN_STRIPE1);
|
|
$markers = array(MARK_DIAMOND, MARK_SQUARE, MARK_CIRCLE, MARK_UTRIANGLE, MARK_DTRIANGLE, MARK_FILLEDCIRCLE, MARK_CROSS, MARK_STAR, MARK_X);
|
|
|
|
// LEGENDS
|
|
if ($type == 'pie' || $type == 'pie3d') {
|
|
$graph = new PieGraph(($w * $k), ($h * $k));
|
|
} else if ($type == 'radar') {
|
|
$graph = new RadarGraph(($w * $k), ($h * $k));
|
|
} else {
|
|
$graph = new Graph(($w * $k), ($h * $k));
|
|
}
|
|
|
|
// mPDF 4.5.009
|
|
// $graph->img->SetImgFormat($img_type) ;
|
|
// if (strtoupper($img_type)=='JPEG') { $graph->img->SetQuality(90); }
|
|
if ($antialias) {
|
|
$graph->img->SetAntiAliasing();
|
|
}
|
|
$graph->SetShadow(true, 2 * $k);
|
|
$graph->SetMarginColor("white");
|
|
// TITLE
|
|
$graph->title->Set($title);
|
|
$graph->title->SetMargin(10 * $k);
|
|
$graph->title->SetFont(FF_USERFONT, FS_BOLD, 11 * $k);
|
|
$graph->title->SetColor("black");
|
|
$graph->legend->SetLineSpacing(3 * $k);
|
|
$graph->legend->SetMarkAbsSize(6 * $k);
|
|
$graph->legend->SetFont(FF_USERFONT, FS_NORMAL, 8 * $k);
|
|
|
|
// Set GRAPH IMAGE MARGINS
|
|
if ($type == 'pie' || $type == 'pie3d') {
|
|
$psize = 0.3;
|
|
$pposxabs = ($w / 2);
|
|
$pposy = 0.55;
|
|
if ($longestlegend) { // if legend showing
|
|
$pposxabs -= ((($longestlegend * 5) + 20) / 2);
|
|
}
|
|
$pposx = ($pposxabs / $w);
|
|
$graph->legend->Pos(0.02, 0.5, 'right', 'center');
|
|
} else if ($type == 'radar') {
|
|
$psize = 0.5;
|
|
$pposxabs = ($w / 2);
|
|
$pposy = 0.55;
|
|
if ($longestlabel) { // if legend showing
|
|
$pposxabs -= ((($longestlabel * 5) + 20) / 2);
|
|
}
|
|
$pposx = ($pposxabs / $w);
|
|
$graph->legend->Pos(0.02, 0.5, 'right', 'center');
|
|
} else if ($type == 'xy' || $type == 'scatter') {
|
|
$pml = 50;
|
|
$pmr = 20;
|
|
$pmt = 60;
|
|
$pmb = 50;
|
|
$xaxislblmargin = $pmb - 30;
|
|
$yaxislblmargin = $pml - 15;
|
|
$graph->legend->Pos(0.02, 0.1, 'right', 'top');
|
|
} else if ($type == 'line' || $type == 'bar') {
|
|
$pml = 50;
|
|
$pmr = 20;
|
|
$pmt = 60;
|
|
$pmb = 50;
|
|
$xlangle = 0;
|
|
$ll = ($longestlegend * 5); // 45 degrees 8pt fontsize
|
|
if ($ll > 5 || ($ll > 3 && count($data) > 10)) {
|
|
$pmb = max($pmb, $ll + 30);
|
|
$xlangle = 50;
|
|
}
|
|
$xaxislblmargin = $pmb - 30;
|
|
$yaxislblmargin = $pml - 15;
|
|
if ($longestlabel && !$overlap) { // if legend showing
|
|
$pmr = ((($longestlabel * 5) + 40));
|
|
}
|
|
$graph->legend->Pos(0.02, 0.1, 'right', 'top');
|
|
} else if ($type == 'horiz_bar') {
|
|
$pml = 50;
|
|
$pmr = 20;
|
|
$pmt = 50;
|
|
$pmb = 45;
|
|
$ll = ($longestlegend * 6.5); // 8pt fontsize
|
|
$pml = max($pml, $ll + 20);
|
|
$xaxislblmargin = $pml - 20;
|
|
$yaxislblmargin = $pmb - 15;
|
|
if ($longestlabel && !$overlap) { // if legend showing
|
|
$pmr = ((($longestlabel * 5) + 40));
|
|
}
|
|
$graph->legend->Pos(0.02, 0.1, 'right', 'top');
|
|
}
|
|
|
|
|
|
// DRAW THE GRAPHS
|
|
if ($type == 'pie') {
|
|
$p1 = new PiePlot($data[0]);
|
|
$p1->SetSliceColors($colours);
|
|
|
|
if ($show_values) {
|
|
$p1->value->SetFont(FF_USERFONT, FS_NORMAL, 8 * $k);
|
|
if ($percent) {
|
|
$p1->SetLabelType(PIE_VALUE_PERADJ);
|
|
} //PIE_VAL_PER = default
|
|
else {
|
|
$p1->SetLabelType(PIE_VALUE_ABS);
|
|
}
|
|
if ($percent || $show_percent) {
|
|
$p1->value->SetFormat("%d%%");
|
|
} else {
|
|
$p1->value->SetFormat("%s");
|
|
}
|
|
// Enable and set policy for guide-lines. Make labels line up vertically
|
|
$p1->SetGuideLines(true);
|
|
$p1->SetGuideLinesAdjust(1.5);
|
|
} else {
|
|
$p1->value->Show(false);
|
|
}
|
|
$p1->SetLegends($legends);
|
|
$p1->SetSize($psize);
|
|
$p1->SetCenter($pposx, $pposy);
|
|
if ($labels[0]) {
|
|
$graph->subtitle->Set($labels[0]);
|
|
$graph->subtitle->SetMargin(10 * $k);
|
|
$graph->subtitle->SetFont(FF_USERFONT, FS_BOLD, 11 * $k);
|
|
$graph->subtitle->SetColor("black");
|
|
}
|
|
$graph->Add($p1);
|
|
} else if ($type == 'pie3d') {
|
|
$p1 = new PiePlot3d($data[0]);
|
|
$p1->SetSliceColors($colours);
|
|
if ($show_values) {
|
|
$p1->value->SetFont(FF_USERFONT, FS_NORMAL, 8 * $k);
|
|
if ($percent) {
|
|
$p1->SetLabelType(PIE_VALUE_PERADJ);
|
|
} //PIE_VAL_PER = default
|
|
else {
|
|
$p1->SetLabelType(PIE_VALUE_ABS);
|
|
}
|
|
if ($percent || $show_percent) {
|
|
$p1->value->SetFormat("%d%%");
|
|
} else {
|
|
$p1->value->SetFormat("%s");
|
|
}
|
|
} else {
|
|
$p1->value->Show(false);
|
|
}
|
|
$p1->SetLegends($legends);
|
|
$p1->SetEdge();
|
|
$p1->SetSize($psize);
|
|
$p1->SetCenter($pposx, $pposy);
|
|
|
|
if ($labels[0]) {
|
|
$graph->subtitle->Set($labels[0]);
|
|
$graph->subtitle->SetMargin(10 * $k);
|
|
$graph->subtitle->SetFont(FF_USERFONT, FS_BOLD, 11 * $k);
|
|
$graph->subtitle->SetColor("black");
|
|
}
|
|
|
|
$graph->Add($p1);
|
|
}
|
|
// RADAR
|
|
else if ($type == 'radar') {
|
|
$graph->SetSize($psize);
|
|
$graph->SetPos($pposx, $pposy);
|
|
|
|
$graph->SetTitles($legends); // labels each axis
|
|
|
|
$graph->axis->title->SetFont(FF_USERFONT, FS_NORMAL, 8 * $k);
|
|
$graph->axis->title->SetMargin(5 * $k);
|
|
$graph->axis->SetWeight(1 * $k);
|
|
$graph->axis->HideLabels();
|
|
$graph->axis->SetFont(FF_USERFONT, FS_NORMAL, 6 * $k);
|
|
$graph->HideTickMarks();
|
|
|
|
$group = array();
|
|
foreach ($data AS $series => $dat) {
|
|
$rdata = array();
|
|
foreach ($data[$series] AS $row) {
|
|
$rdata[] = $row;
|
|
}
|
|
if (count($rdata) < 3) {
|
|
throw new MpdfException("ERROR::Graph::Cannot create a Radar Plot with less than 3 data points.");
|
|
}
|
|
// Create the radar plot
|
|
$bplot = new RadarPlot($rdata);
|
|
$bplot->mark->SetType($markers[$series]);
|
|
$bplot->mark->SetFillColor($colours[$series]);
|
|
$bplot->mark->SetWidth(3 * $k);
|
|
$bplot->SetColor($colours[$series]);
|
|
if ($series == 0) {
|
|
$bplot->SetFillColor('lightred');
|
|
} else {
|
|
$bplot->SetFill(false);
|
|
}
|
|
$bplot->SetLineWeight(1 * $k);
|
|
$bplot->SetLegend($labels[$series]);
|
|
if ($bandw) {
|
|
$bplot->SetShadow("gray5");
|
|
}
|
|
$graph->Add($bplot);
|
|
}
|
|
}
|
|
// LINE
|
|
else if ($type == 'line') {
|
|
// Setup the graph.
|
|
$graph->img->SetMargin($pml * $k, $pmr * $k, $pmt * $k, $pmb * $k); // LRTB
|
|
$graph->SetScale($axes);
|
|
$graph->yaxis->SetFont(FF_USERFONT, FS_NORMAL, 8 * $k);
|
|
|
|
if ($ylabel) {
|
|
$graph->yaxis->title->SetFont(FF_USERFONT, FS_NORMAL, 8 * $k);
|
|
$graph->yaxis->SetTitle($ylabel, 'middle');
|
|
$graph->yaxis->SetTitleMargin($yaxislblmargin * $k);
|
|
}
|
|
|
|
$graph->yaxis->SetLabelMargin(4 * $k);
|
|
if ($percent || $show_percent) {
|
|
$graph->yaxis->SetLabelFormat('%d%%');
|
|
} // Percent
|
|
// Show 0 label on Y-axis (default is not to show)
|
|
$graph->yscale->ticks->SupressZeroLabel(true);
|
|
if ($hide_y_axis) {
|
|
$graph->yaxis->Hide();
|
|
}
|
|
if ($hide_grid) {
|
|
$graph->ygrid->Show(false);
|
|
}
|
|
|
|
// Setup X-axis labels
|
|
$graph->xaxis->SetFont(FF_USERFONT, FS_NORMAL, 8 * $k);
|
|
$graph->xaxis->SetTickLabels($legends);
|
|
$graph->xaxis->SetLabelAngle($xlangle);
|
|
$graph->xaxis->SetLabelMargin(4 * $k);
|
|
// X-axis title
|
|
if ($xlabel) {
|
|
$graph->xaxis->title->SetFont(FF_USERFONT, FS_NORMAL, 8 * $k);
|
|
$graph->xaxis->SetTitle($xlabel, 'middle');
|
|
$graph->xaxis->SetTitleMargin($xaxislblmargin * $k);
|
|
}
|
|
foreach ($data AS $series => $rdata) {
|
|
$bplot = new LinePlot($rdata);
|
|
$bplot->mark->SetType($markers[$series]);
|
|
$bplot->mark->SetFillColor($colours[$series]);
|
|
$bplot->mark->SetWidth(4 * $k);
|
|
if ($show_values) {
|
|
$bplot->value->Show(); // Not if scatter
|
|
$bplot->value->SetMargin(6 * $k);
|
|
$bplot->value->SetColor("darkred");
|
|
$bplot->value->SetFont(FF_USERFONT, FS_NORMAL, 8 * $k);
|
|
if ($percent || $show_percent) {
|
|
$bplot->value->SetFormat('%d%%');
|
|
} else {
|
|
$bplot->value->SetFormat("%s");
|
|
}
|
|
}
|
|
// Set color for each line
|
|
$bplot->SetColor($colours[$series]);
|
|
$bplot->SetWeight(2 * $k);
|
|
$bplot->SetLegend($labels[$series]);
|
|
if ($bandw) {
|
|
$bplot->SetShadow("gray5");
|
|
}
|
|
// Indent the X-scale so the first and last point doesn't fall on the edges
|
|
$bplot->SetCenter();
|
|
$graph->Add($bplot);
|
|
}
|
|
}
|
|
// XY or SCATTER
|
|
else if ($type == 'xy' || $type == 'scatter') {
|
|
// Setup the graph.
|
|
$graph->img->SetMargin($pml * $k, $pmr * $k, $pmt * $k, $pmb * $k); // LRTB
|
|
$graph->SetScale($axes);
|
|
// Setup font for axis
|
|
$graph->yaxis->SetFont(FF_USERFONT, FS_NORMAL, 8 * $k);
|
|
// Y-axis title
|
|
if ($labels[1]) {
|
|
$graph->yaxis->title->SetFont(FF_USERFONT, FS_NORMAL, 8 * $k);
|
|
$graph->yaxis->SetTitleMargin($yaxislblmargin * $k);
|
|
$graph->yaxis->SetTitle($labels[1], 'middle');
|
|
}
|
|
|
|
|
|
$graph->yaxis->SetLabelMargin(4 * $k);
|
|
if ($percent || $show_percent) {
|
|
$graph->yaxis->SetLabelFormat('%d%%');
|
|
} // Percent
|
|
// Show 0 label on Y-axis (default is not to show)
|
|
$graph->yscale->ticks->SupressZeroLabel(true);
|
|
// Just let the maximum be autoscaled
|
|
$graph->yaxis->scale->SetAutoMin(0);
|
|
if ($hide_y_axis) {
|
|
$graph->yaxis->Hide();
|
|
}
|
|
if ($hide_grid) {
|
|
$graph->ygrid->Show(false);
|
|
}
|
|
|
|
// Setup X-axis labels
|
|
$graph->xaxis->SetFont(FF_USERFONT, FS_NORMAL, 8 * $k);
|
|
// mPDF 2.5 Corrects labelling of x-axis
|
|
// $graph->xaxis->SetTickLabels($legends);
|
|
$graph->xaxis->SetLabelAngle(50);
|
|
$graph->xaxis->SetLabelMargin(4 * $k);
|
|
// X-axis title
|
|
if ($labels[0]) {
|
|
$graph->xaxis->title->SetFont(FF_USERFONT, FS_NORMAL, 8 * $k);
|
|
$graph->xaxis->SetTitleMargin($xaxislblmargin * $k);
|
|
$graph->xaxis->SetTitle($labels[0], 'middle');
|
|
}
|
|
|
|
// Create the bar plot
|
|
// SPLINES
|
|
if ($splines && $type == 'xy') {
|
|
$spline = new Spline($data[0], $data[1]);
|
|
list($newx, $newy) = $spline->Get(100);
|
|
} else {
|
|
$newx = $data[0];
|
|
$newy = $data[1];
|
|
}
|
|
|
|
if ($type == 'xy') {
|
|
// LINE PLOT
|
|
$bplot = new LinePlot($newy, $newx);
|
|
// Set color for each line
|
|
$bplot->SetColor($fills[0]);
|
|
$bplot->SetWeight(4 * $k);
|
|
if ($bandw) {
|
|
$bplot->SetShadow("gray5");
|
|
}
|
|
$graph->Add($bplot);
|
|
}
|
|
|
|
// SCATTER PLOT
|
|
$cplot = new ScatterPlot($data[1], $data[0]);
|
|
|
|
$cplot->mark->SetType($markers[0]);
|
|
$cplot->mark->SetFillColor($fills[0]);
|
|
$cplot->mark->SetWidth(8 * $k);
|
|
if ($show_values) {
|
|
// mPDF 2.5
|
|
if ($type == 'xy') {
|
|
$cplot->value->Show();
|
|
} // Not if scatter
|
|
$cplot->value->SetMargin(8 * $k);
|
|
$cplot->value->SetColor("darkred");
|
|
$cplot->value->SetFont(FF_USERFONT, FS_NORMAL, 6 * $k);
|
|
|
|
if ($percent || $show_percent) {
|
|
$cplot->value->SetFormat('%d%%');
|
|
} else {
|
|
$cplot->value->SetFormat("%s");
|
|
}
|
|
}
|
|
|
|
// Set color for each line
|
|
$cplot->SetColor($fills[0]);
|
|
$cplot->SetWeight(4 * $k);
|
|
if ($bandw) {
|
|
$cplot->SetShadow("gray5");
|
|
}
|
|
$graph->Add($cplot);
|
|
}
|
|
// BAR
|
|
else if ($type == 'bar') {
|
|
// Setup the graph.
|
|
$graph->img->SetMargin($pml * $k, $pmr * $k, $pmt * $k, $pmb * $k); // LRTB
|
|
$graph->SetScale($axes);
|
|
// Setup y-axis
|
|
$graph->yaxis->SetFont(FF_USERFONT, FS_NORMAL, 8 * $k);
|
|
if ($hide_y_axis) {
|
|
$graph->yaxis->Hide();
|
|
}
|
|
if ($hide_grid) {
|
|
$graph->ygrid->Show(false);
|
|
}
|
|
$graph->yaxis->SetLabelMargin(4 * $k);
|
|
if ($ylabel) {
|
|
$graph->yaxis->title->SetFont(FF_USERFONT, FS_NORMAL, 8 * $k);
|
|
$graph->yaxis->SetTitle($ylabel, 'middle');
|
|
$graph->yaxis->SetTitleMargin($yaxislblmargin * $k);
|
|
}
|
|
// Show 0 label on Y-axis (default is not to show)
|
|
$graph->yscale->ticks->SupressZeroLabel(false);
|
|
// Setup X-axis labels
|
|
$graph->xaxis->SetFont(FF_USERFONT, FS_NORMAL, 8 * $k);
|
|
$graph->xaxis->SetTickLabels($legends);
|
|
$graph->xaxis->SetLabelAngle($xlangle);
|
|
$graph->xaxis->SetLabelMargin(4 * $k);
|
|
// X-axis title
|
|
if ($xlabel) {
|
|
$graph->xaxis->title->SetFont(FF_USERFONT, FS_NORMAL, 8 * $k);
|
|
$graph->xaxis->SetTitle($xlabel, 'middle');
|
|
$graph->xaxis->SetTitleMargin($xaxislblmargin * $k);
|
|
}
|
|
|
|
$group = array();
|
|
foreach ($data AS $series => $dat) {
|
|
$rdata = array();
|
|
foreach ($data[$series] AS $row) {
|
|
$rdata[] = $row;
|
|
}
|
|
|
|
// Create the bar plot
|
|
$bplot = new BarPlot($rdata);
|
|
$bplot->SetWidth(0.6); // for SINGLE??
|
|
// Setup color for gradient fill style
|
|
if ($bandw) {
|
|
$bplot->SetPattern($patterns[$series]);
|
|
} else {
|
|
$bplot->SetFillGradient($fills[$series], "#EEEEEE", GRAD_LEFT_REFLECTION);
|
|
}
|
|
|
|
// Set color for the frame of each bar
|
|
$bplot->SetColor("darkgray");
|
|
$bplot->SetLegend($labels[$series]);
|
|
if ($bandw) {
|
|
$bplot->SetShadow("gray5");
|
|
}
|
|
if ($show_values) {
|
|
$bplot->value->Show();
|
|
$bplot->value->SetMargin(6 * $k);
|
|
$bplot->value->SetColor("darkred");
|
|
$bplot->value->SetFont(FF_USERFONT, FS_NORMAL, 8 * $k);
|
|
if ($percent || $show_percent) {
|
|
$bplot->value->SetFormat('%d%%');
|
|
} else {
|
|
$bplot->value->SetFormat("%s");
|
|
}
|
|
}
|
|
|
|
$group[] = $bplot;
|
|
}
|
|
if (count($data) == 1) {
|
|
$graph->Add($group[0]);
|
|
} else {
|
|
// Create the grouped bar plot
|
|
if ($stacked) {
|
|
$gbplot = new AccBarPlot($group);
|
|
} else {
|
|
$gbplot = new GroupBarPlot($group);
|
|
}
|
|
$graph->Add($gbplot);
|
|
}
|
|
} else if ($type == 'horiz_bar') {
|
|
$graph->SetScale($axes);
|
|
$graph->Set90AndMargin($pml * $k, $pmr * $k, $pmt * $k, $pmb * $k); // LRTB
|
|
// Setup y-axis
|
|
$graph->yaxis->SetFont(FF_USERFONT, FS_NORMAL, 8 * $k);
|
|
$graph->yaxis->SetLabelMargin(4 * $k);
|
|
|
|
$graph->yaxis->SetPos('max'); // Intersect at top of x-axis i.e. y axis is at bottom
|
|
// First make the labels look right
|
|
$graph->yaxis->SetLabelAlign('center', 'top');
|
|
if ($percent || $show_percent) {
|
|
$graph->yaxis->SetLabelFormat('%d%%');
|
|
}
|
|
$graph->yaxis->SetLabelSide(SIDE_RIGHT);
|
|
$graph->yaxis->scale->SetGrace(10); // sets 10% headroom
|
|
if ($hide_y_axis) {
|
|
$graph->yaxis->Hide();
|
|
}
|
|
if ($hide_grid) {
|
|
$graph->ygrid->Show(false);
|
|
}
|
|
|
|
// The fix the tick marks
|
|
$graph->yaxis->SetTickSide(SIDE_LEFT);
|
|
if ($ylabel) {
|
|
$graph->yaxis->title->SetFont(FF_USERFONT, FS_NORMAL, 8 * $k);
|
|
$graph->yaxis->SetTitle($ylabel, 'middle');
|
|
$graph->yaxis->SetTitleMargin($yaxislblmargin * $k);
|
|
// Finally setup the title
|
|
$graph->yaxis->SetTitleSide(SIDE_RIGHT);
|
|
// To align the title to the right use :
|
|
$graph->yaxis->title->Align('right');
|
|
$graph->yaxis->title->SetAngle(0);
|
|
}
|
|
|
|
// Show 0 label on Y-axis (default is not to show)
|
|
$graph->yscale->ticks->SupressZeroLabel(false);
|
|
// Setup X-axis labels
|
|
$graph->xaxis->SetFont(FF_USERFONT, FS_NORMAL, 8 * $k);
|
|
$graph->xaxis->title->SetAngle(90);
|
|
$graph->xaxis->SetTickLabels($legends);
|
|
$graph->xaxis->SetLabelMargin(4 * $k);
|
|
// X-axis title
|
|
if ($xlabel) {
|
|
$graph->xaxis->title->SetFont(FF_USERFONT, FS_NORMAL, 8 * $k);
|
|
$graph->xaxis->SetTitleMargin($xaxislblmargin * $k);
|
|
$graph->xaxis->SetTitle($xlabel, 'middle');
|
|
}
|
|
$group = array();
|
|
foreach ($data AS $series => $dat) {
|
|
$rdata = array();
|
|
foreach ($data[$series] AS $row) {
|
|
$rdata[] = $row;
|
|
}
|
|
// Create the bar pot
|
|
$bplot = new BarPlot($rdata);
|
|
$bplot->SetWidth(0.6); // for SINGLE??
|
|
// Setup color for gradient fill style
|
|
if ($bandw) {
|
|
$bplot->SetPattern($patterns[$series]);
|
|
} else {
|
|
$bplot->SetFillGradient($fills[$series], "#EEEEEE", GRAD_LEFT_REFLECTION);
|
|
}
|
|
|
|
// Set color for the frame of each bar
|
|
$bplot->SetColor("darkgray");
|
|
$bplot->SetLegend($labels[$series]);
|
|
if ($bandw) {
|
|
$bplot->SetShadow("gray5");
|
|
}
|
|
if ($show_values) {
|
|
$bplot->value->Show();
|
|
$bplot->value->SetMargin(6 * $k);
|
|
$bplot->value->SetColor("darkred");
|
|
$bplot->value->SetFont(FF_USERFONT, FS_NORMAL, 8 * $k);
|
|
if ($percent || $show_percent) {
|
|
$bplot->value->SetFormat('%d%%');
|
|
} else {
|
|
$bplot->value->SetFormat("%s");
|
|
}
|
|
}
|
|
|
|
$group[] = $bplot;
|
|
}
|
|
if (count($data) == 1) {
|
|
$graph->Add($group[0]);
|
|
} else {
|
|
// Create the grouped bar plot
|
|
if ($stacked) {
|
|
$gbplot = new AccBarPlot($group);
|
|
} else {
|
|
$gbplot = new GroupBarPlot($group);
|
|
}
|
|
$graph->Add($gbplot);
|
|
}
|
|
}
|
|
if ($graph) {
|
|
$graph->Stroke(_MPDF_PATH . $figure_file);
|
|
$srcpath = str_replace("\\", "/", dirname(__FILE__)) . "/";
|
|
$srcpath .= $figure_file;
|
|
return array('file' => $srcpath, 'w' => $w, 'h' => $h);
|
|
}
|
|
}
|
|
return false;
|
|
|
|
}
|