ILIAS  release_5-2 Revision v5.2.25-18-g3f80b828510
jpgraph.php
Go to the documentation of this file.
1<?php
2
30require_once(PHPExcel_Settings::getChartRendererPath().'/jpgraph.php');
31
32
41{
42 private static $_width = 640;
43
44 private static $_height = 480;
45
46 private static $_colourSet = array( 'mediumpurple1', 'palegreen3', 'gold1', 'cadetblue1',
47 'darkmagenta', 'coral', 'dodgerblue3', 'eggplant',
48 'mediumblue', 'magenta', 'sandybrown', 'cyan',
49 'firebrick1', 'forestgreen', 'deeppink4', 'darkolivegreen',
50 'goldenrod2'
51 );
52
53 private static $_markSet = array( 'diamond' => MARK_DIAMOND,
54 'square' => MARK_SQUARE,
55 'triangle' => MARK_UTRIANGLE,
56 'x' => MARK_X,
57 'star' => MARK_STAR,
58 'dot' => MARK_FILLEDCIRCLE,
59 'dash' => MARK_DTRIANGLE,
60 'circle' => MARK_CIRCLE,
61 'plus' => MARK_CROSS
62 );
63
64
65 private $_chart = null;
66
67 private $_graph = null;
68
69 private static $_plotColour = 0;
70
71 private static $_plotMark = 0;
72
73
74 private function _formatPointMarker($seriesPlot,$markerID) {
75 $plotMarkKeys = array_keys(self::$_markSet);
76 if (is_null($markerID)) {
77 // Use default plot marker (next marker in the series)
78 self::$_plotMark %= count(self::$_markSet);
79 $seriesPlot->mark->SetType(self::$_markSet[$plotMarkKeys[self::$_plotMark++]]);
80 } elseif ($markerID !== 'none') {
81 // Use specified plot marker (if it exists)
82 if (isset(self::$_markSet[$markerID])) {
83 $seriesPlot->mark->SetType(self::$_markSet[$markerID]);
84 } else {
85 // If the specified plot marker doesn't exist, use default plot marker (next marker in the series)
86 self::$_plotMark %= count(self::$_markSet);
87 $seriesPlot->mark->SetType(self::$_markSet[$plotMarkKeys[self::$_plotMark++]]);
88 }
89 } else {
90 // Hide plot marker
91 $seriesPlot->mark->Hide();
92 }
93 $seriesPlot->mark->SetColor(self::$_colourSet[self::$_plotColour]);
94 $seriesPlot->mark->SetFillColor(self::$_colourSet[self::$_plotColour]);
95 $seriesPlot->SetColor(self::$_colourSet[self::$_plotColour++]);
96
97 return $seriesPlot;
98 } // function _formatPointMarker()
99
100
101 private function _formatDataSetLabels($groupID, $datasetLabels, $labelCount, $rotation = '') {
102 $datasetLabelFormatCode = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getFormatCode();
103 if (!is_null($datasetLabelFormatCode)) {
104 // Retrieve any label formatting code
105 $datasetLabelFormatCode = stripslashes($datasetLabelFormatCode);
106 }
107
108 $testCurrentIndex = 0;
109 foreach($datasetLabels as $i => $datasetLabel) {
110 if (is_array($datasetLabel)) {
111 if ($rotation == 'bar') {
112 $datasetLabels[$i] = implode(" ",$datasetLabel);
113 } else {
114 $datasetLabel = array_reverse($datasetLabel);
115 $datasetLabels[$i] = implode("\n",$datasetLabel);
116 }
117 } else {
118 // Format labels according to any formatting code
119 if (!is_null($datasetLabelFormatCode)) {
120 $datasetLabels[$i] = PHPExcel_Style_NumberFormat::toFormattedString($datasetLabel,$datasetLabelFormatCode);
121 }
122 }
123 ++$testCurrentIndex;
124 }
125
126 return $datasetLabels;
127 } // function _formatDataSetLabels()
128
129
130 private function _percentageSumCalculation($groupID,$seriesCount) {
131 // Adjust our values to a percentage value across all series in the group
132 for($i = 0; $i < $seriesCount; ++$i) {
133 if ($i == 0) {
134 $sumValues = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues();
135 } else {
136 $nextValues = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues();
137 foreach($nextValues as $k => $value) {
138 if (isset($sumValues[$k])) {
139 $sumValues[$k] += $value;
140 } else {
141 $sumValues[$k] = $value;
142 }
143 }
144 }
145 }
146
147 return $sumValues;
148 } // function _percentageSumCalculation()
149
150
151 private function _percentageAdjustValues($dataValues,$sumValues) {
152 foreach($dataValues as $k => $dataValue) {
153 $dataValues[$k] = $dataValue / $sumValues[$k] * 100;
154 }
155
156 return $dataValues;
157 } // function _percentageAdjustValues()
158
159
160 private function _getCaption($captionElement) {
161 // Read any caption
162 $caption = (!is_null($captionElement)) ? $captionElement->getCaption() : NULL;
163 // Test if we have a title caption to display
164 if (!is_null($caption)) {
165 // If we do, it could be a plain string or an array
166 if (is_array($caption)) {
167 // Implode an array to a plain string
168 $caption = implode('',$caption);
169 }
170 }
171 return $caption;
172 } // function _getCaption()
173
174
175 private function _renderTitle() {
176 $title = $this->_getCaption($this->_chart->getTitle());
177 if (!is_null($title)) {
178 $this->_graph->title->Set($title);
179 }
180 } // function _renderTitle()
181
182
183 private function _renderLegend() {
184 $legend = $this->_chart->getLegend();
185 if (!is_null($legend)) {
186 $legendPosition = $legend->getPosition();
187 $legendOverlay = $legend->getOverlay();
188 switch ($legendPosition) {
189 case 'r' :
190 $this->_graph->legend->SetPos(0.01,0.5,'right','center'); // right
191 $this->_graph->legend->SetColumns(1);
192 break;
193 case 'l' :
194 $this->_graph->legend->SetPos(0.01,0.5,'left','center'); // left
195 $this->_graph->legend->SetColumns(1);
196 break;
197 case 't' :
198 $this->_graph->legend->SetPos(0.5,0.01,'center','top'); // top
199 break;
200 case 'b' :
201 $this->_graph->legend->SetPos(0.5,0.99,'center','bottom'); // bottom
202 break;
203 default :
204 $this->_graph->legend->SetPos(0.01,0.01,'right','top'); // top-right
205 $this->_graph->legend->SetColumns(1);
206 break;
207 }
208 } else {
209 $this->_graph->legend->Hide();
210 }
211 } // function _renderLegend()
212
213
214 private function _renderCartesianPlotArea($type='textlin') {
215 $this->_graph = new Graph(self::$_width,self::$_height);
216 $this->_graph->SetScale($type);
217
218 $this->_renderTitle();
219
220 // Rotate for bar rather than column chart
221 $rotation = $this->_chart->getPlotArea()->getPlotGroupByIndex(0)->getPlotDirection();
222 $reverse = ($rotation == 'bar') ? true : false;
223
224 $xAxisLabel = $this->_chart->getXAxisLabel();
225 if (!is_null($xAxisLabel)) {
227 if (!is_null($title)) {
228 $this->_graph->xaxis->SetTitle($title,'center');
229 $this->_graph->xaxis->title->SetMargin(35);
230 if ($reverse) {
231 $this->_graph->xaxis->title->SetAngle(90);
232 $this->_graph->xaxis->title->SetMargin(90);
233 }
234 }
235 }
236
237 $yAxisLabel = $this->_chart->getYAxisLabel();
238 if (!is_null($yAxisLabel)) {
240 if (!is_null($title)) {
241 $this->_graph->yaxis->SetTitle($title,'center');
242 if ($reverse) {
243 $this->_graph->yaxis->title->SetAngle(0);
244 $this->_graph->yaxis->title->SetMargin(-55);
245 }
246 }
247 }
248 } // function _renderCartesianPlotArea()
249
250
251 private function _renderPiePlotArea($doughnut = False) {
252 $this->_graph = new PieGraph(self::$_width,self::$_height);
253
254 $this->_renderTitle();
255 } // function _renderPiePlotArea()
256
257
258 private function _renderRadarPlotArea() {
259 $this->_graph = new RadarGraph(self::$_width,self::$_height);
260 $this->_graph->SetScale('lin');
261
262 $this->_renderTitle();
263 } // function _renderRadarPlotArea()
264
265
266 private function _renderPlotLine($groupID, $filled = false, $combination = false, $dimensions = '2d') {
267 $grouping = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotGrouping();
268
269 $labelCount = count($this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex(0)->getPointCount());
270 if ($labelCount > 0) {
271 $datasetLabels = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getDataValues();
272 $datasetLabels = $this->_formatDataSetLabels($groupID, $datasetLabels, $labelCount);
273 $this->_graph->xaxis->SetTickLabels($datasetLabels);
274 }
275
276 $seriesCount = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount();
277 $seriesPlots = array();
278 if ($grouping == 'percentStacked') {
279 $sumValues = $this->_percentageSumCalculation($groupID,$seriesCount);
280 }
281
282 // Loop through each data series in turn
283 for($i = 0; $i < $seriesCount; ++$i) {
284 $dataValues = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues();
285 $marker = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getPointMarker();
286
287 if ($grouping == 'percentStacked') {
288 $dataValues = $this->_percentageAdjustValues($dataValues,$sumValues);
289 }
290
291 // Fill in any missing values in the $dataValues array
292 $testCurrentIndex = 0;
293 foreach($dataValues as $k => $dataValue) {
294 while($k != $testCurrentIndex) {
295 $dataValues[$testCurrentIndex] = null;
296 ++$testCurrentIndex;
297 }
298 ++$testCurrentIndex;
299 }
300
301 $seriesPlot = new LinePlot($dataValues);
302 if ($combination) {
303 $seriesPlot->SetBarCenter();
304 }
305
306 if ($filled) {
307 $seriesPlot->SetFilled(true);
308 $seriesPlot->SetColor('black');
309 $seriesPlot->SetFillColor(self::$_colourSet[self::$_plotColour++]);
310 } else {
311 // Set the appropriate plot marker
312 $this->_formatPointMarker($seriesPlot,$marker);
313 }
314 $dataLabel = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($i)->getDataValue();
315 $seriesPlot->SetLegend($dataLabel);
316
317 $seriesPlots[] = $seriesPlot;
318 }
319
320 if ($grouping == 'standard') {
321 $groupPlot = $seriesPlots;
322 } else {
323 $groupPlot = new AccLinePlot($seriesPlots);
324 }
325 $this->_graph->Add($groupPlot);
326 } // function _renderPlotLine()
327
328
329 private function _renderPlotBar($groupID, $dimensions = '2d') {
330 $rotation = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotDirection();
331 // Rotate for bar rather than column chart
332 if (($groupID == 0) && ($rotation == 'bar')) {
333 $this->_graph->Set90AndMargin();
334 }
335 $grouping = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotGrouping();
336
337 $labelCount = count($this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex(0)->getPointCount());
338 if ($labelCount > 0) {
339 $datasetLabels = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getDataValues();
340 $datasetLabels = $this->_formatDataSetLabels($groupID, $datasetLabels, $labelCount, $rotation);
341 // Rotate for bar rather than column chart
342 if ($rotation == 'bar') {
343 $datasetLabels = array_reverse($datasetLabels);
344 $this->_graph->yaxis->SetPos('max');
345 $this->_graph->yaxis->SetLabelAlign('center','top');
346 $this->_graph->yaxis->SetLabelSide(SIDE_RIGHT);
347 }
348 $this->_graph->xaxis->SetTickLabels($datasetLabels);
349 }
350
351
352 $seriesCount = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount();
353 $seriesPlots = array();
354 if ($grouping == 'percentStacked') {
355 $sumValues = $this->_percentageSumCalculation($groupID,$seriesCount);
356 }
357
358 // Loop through each data series in turn
359 for($j = 0; $j < $seriesCount; ++$j) {
360 $dataValues = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($j)->getDataValues();
361 if ($grouping == 'percentStacked') {
362 $dataValues = $this->_percentageAdjustValues($dataValues,$sumValues);
363 }
364
365 // Fill in any missing values in the $dataValues array
366 $testCurrentIndex = 0;
367 foreach($dataValues as $k => $dataValue) {
368 while($k != $testCurrentIndex) {
369 $dataValues[$testCurrentIndex] = null;
370 ++$testCurrentIndex;
371 }
372 ++$testCurrentIndex;
373 }
374
375 // Reverse the $dataValues order for bar rather than column chart
376 if ($rotation == 'bar') {
377 $dataValues = array_reverse($dataValues);
378 }
379 $seriesPlot = new BarPlot($dataValues);
380 $seriesPlot->SetColor('black');
381 $seriesPlot->SetFillColor(self::$_colourSet[self::$_plotColour++]);
382 if ($dimensions == '3d') {
383 $seriesPlot->SetShadow();
384 }
385 if (!$this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($j)) {
386 $dataLabel = '';
387 } else {
388 $dataLabel = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($j)->getDataValue();
389 }
390 $seriesPlot->SetLegend($dataLabel);
391
392 $seriesPlots[] = $seriesPlot;
393 }
394 // Reverse the plot order for bar rather than column chart
395 if (($rotation == 'bar') && (!($grouping == 'percentStacked'))) {
396 $seriesPlots = array_reverse($seriesPlots);
397 }
398
399 if ($grouping == 'clustered') {
400 $groupPlot = new GroupBarPlot($seriesPlots);
401 } elseif ($grouping == 'standard') {
402 $groupPlot = new GroupBarPlot($seriesPlots);
403 } else {
404 $groupPlot = new AccBarPlot($seriesPlots);
405 if ($dimensions == '3d') {
406 $groupPlot->SetShadow();
407 }
408 }
409
410 $this->_graph->Add($groupPlot);
411 } // function _renderPlotBar()
412
413
414 private function _renderPlotScatter($groupID,$bubble) {
415 $grouping = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotGrouping();
416 $scatterStyle = $bubbleSize = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotStyle();
417
418 $seriesCount = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount();
419 $seriesPlots = array();
420
421 // Loop through each data series in turn
422 for($i = 0; $i < $seriesCount; ++$i) {
423 $dataValuesY = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex($i)->getDataValues();
424 $dataValuesX = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues();
425
426 foreach($dataValuesY as $k => $dataValueY) {
427 $dataValuesY[$k] = $k;
428 }
429
430 $seriesPlot = new ScatterPlot($dataValuesX,$dataValuesY);
431 if ($scatterStyle == 'lineMarker') {
432 $seriesPlot->SetLinkPoints();
433 $seriesPlot->link->SetColor(self::$_colourSet[self::$_plotColour]);
434 } elseif ($scatterStyle == 'smoothMarker') {
435 $spline = new Spline($dataValuesY,$dataValuesX);
436 list($splineDataY,$splineDataX) = $spline->Get(count($dataValuesX) * self::$_width / 20);
437 $lplot = new LinePlot($splineDataX,$splineDataY);
438 $lplot->SetColor(self::$_colourSet[self::$_plotColour]);
439
440 $this->_graph->Add($lplot);
441 }
442
443 if ($bubble) {
444 $this->_formatPointMarker($seriesPlot,'dot');
445 $seriesPlot->mark->SetColor('black');
446 $seriesPlot->mark->SetSize($bubbleSize);
447 } else {
448 $marker = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getPointMarker();
449 $this->_formatPointMarker($seriesPlot,$marker);
450 }
451 $dataLabel = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($i)->getDataValue();
452 $seriesPlot->SetLegend($dataLabel);
453
454 $this->_graph->Add($seriesPlot);
455 }
456 } // function _renderPlotScatter()
457
458
459 private function _renderPlotRadar($groupID) {
460 $radarStyle = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotStyle();
461
462 $seriesCount = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount();
463 $seriesPlots = array();
464
465 // Loop through each data series in turn
466 for($i = 0; $i < $seriesCount; ++$i) {
467 $dataValuesY = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex($i)->getDataValues();
468 $dataValuesX = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues();
469 $marker = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getPointMarker();
470
471 $dataValues = array();
472 foreach($dataValuesY as $k => $dataValueY) {
473 $dataValues[$k] = implode(' ',array_reverse($dataValueY));
474 }
475 $tmp = array_shift($dataValues);
476 $dataValues[] = $tmp;
477 $tmp = array_shift($dataValuesX);
478 $dataValuesX[] = $tmp;
479
480 $this->_graph->SetTitles(array_reverse($dataValues));
481
482 $seriesPlot = new RadarPlot(array_reverse($dataValuesX));
483
484 $dataLabel = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($i)->getDataValue();
485 $seriesPlot->SetColor(self::$_colourSet[self::$_plotColour++]);
486 if ($radarStyle == 'filled') {
487 $seriesPlot->SetFillColor(self::$_colourSet[self::$_plotColour]);
488 }
489 $this->_formatPointMarker($seriesPlot,$marker);
490 $seriesPlot->SetLegend($dataLabel);
491
492 $this->_graph->Add($seriesPlot);
493 }
494 } // function _renderPlotRadar()
495
496
497 private function _renderPlotContour($groupID) {
498 $contourStyle = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotStyle();
499
500 $seriesCount = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount();
501 $seriesPlots = array();
502
503 $dataValues = array();
504 // Loop through each data series in turn
505 for($i = 0; $i < $seriesCount; ++$i) {
506 $dataValuesY = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex($i)->getDataValues();
507 $dataValuesX = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues();
508
509 $dataValues[$i] = $dataValuesX;
510 }
511 $seriesPlot = new ContourPlot($dataValues);
512
513 $this->_graph->Add($seriesPlot);
514 } // function _renderPlotContour()
515
516
517 private function _renderPlotStock($groupID) {
518 $seriesCount = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount();
519 $plotOrder = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotOrder();
520
521 $dataValues = array();
522 // Loop through each data series in turn and build the plot arrays
523 foreach($plotOrder as $i => $v) {
524 $dataValuesX = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($v)->getDataValues();
525 foreach($dataValuesX as $j => $dataValueX) {
526 $dataValues[$plotOrder[$i]][$j] = $dataValueX;
527 }
528 }
529 if(empty($dataValues)) {
530 return;
531 }
532
533 $dataValuesPlot = array();
534 // Flatten the plot arrays to a single dimensional array to work with jpgraph
535 for($j = 0; $j < count($dataValues[0]); $j++) {
536 for($i = 0; $i < $seriesCount; $i++) {
537 $dataValuesPlot[] = $dataValues[$i][$j];
538 }
539 }
540
541 // Set the x-axis labels
542 $labelCount = count($this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex(0)->getPointCount());
543 if ($labelCount > 0) {
544 $datasetLabels = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getDataValues();
545 $datasetLabels = $this->_formatDataSetLabels($groupID, $datasetLabels, $labelCount);
546 $this->_graph->xaxis->SetTickLabels($datasetLabels);
547 }
548
549 $seriesPlot = new StockPlot($dataValuesPlot);
550 $seriesPlot->SetWidth(20);
551
552 $this->_graph->Add($seriesPlot);
553 } // function _renderPlotStock()
554
555
556 private function _renderAreaChart($groupCount, $dimensions = '2d') {
557 require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_line.php');
558
560
561 for($i = 0; $i < $groupCount; ++$i) {
562 $this->_renderPlotLine($i,True,False,$dimensions);
563 }
564 } // function _renderAreaChart()
565
566
567 private function _renderLineChart($groupCount, $dimensions = '2d') {
568 require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_line.php');
569
571
572 for($i = 0; $i < $groupCount; ++$i) {
573 $this->_renderPlotLine($i,False,False,$dimensions);
574 }
575 } // function _renderLineChart()
576
577
578 private function _renderBarChart($groupCount, $dimensions = '2d') {
579 require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_bar.php');
580
582
583 for($i = 0; $i < $groupCount; ++$i) {
584 $this->_renderPlotBar($i,$dimensions);
585 }
586 } // function _renderBarChart()
587
588
589 private function _renderScatterChart($groupCount) {
590 require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_scatter.php');
591 require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_regstat.php');
592 require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_line.php');
593
594 $this->_renderCartesianPlotArea('linlin');
595
596 for($i = 0; $i < $groupCount; ++$i) {
597 $this->_renderPlotScatter($i,false);
598 }
599 } // function _renderScatterChart()
600
601
602 private function _renderBubbleChart($groupCount) {
603 require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_scatter.php');
604
605 $this->_renderCartesianPlotArea('linlin');
606
607 for($i = 0; $i < $groupCount; ++$i) {
608 $this->_renderPlotScatter($i,true);
609 }
610 } // function _renderBubbleChart()
611
612
613 private function _renderPieChart($groupCount, $dimensions = '2d', $doughnut = False, $multiplePlots = False) {
614 require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_pie.php');
615 if ($dimensions == '3d') {
616 require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_pie3d.php');
617 }
618
619 $this->_renderPiePlotArea($doughnut);
620
621 $iLimit = ($multiplePlots) ? $groupCount : 1;
622 for($groupID = 0; $groupID < $iLimit; ++$groupID) {
623 $grouping = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotGrouping();
624 $exploded = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotStyle();
625 if ($groupID == 0) {
626 $labelCount = count($this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex(0)->getPointCount());
627 if ($labelCount > 0) {
628 $datasetLabels = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getDataValues();
629 $datasetLabels = $this->_formatDataSetLabels($groupID, $datasetLabels, $labelCount);
630 }
631 }
632
633 $seriesCount = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount();
634 $seriesPlots = array();
635 // For pie charts, we only display the first series: doughnut charts generally display all series
636 $jLimit = ($multiplePlots) ? $seriesCount : 1;
637 // Loop through each data series in turn
638 for($j = 0; $j < $jLimit; ++$j) {
639 $dataValues = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($j)->getDataValues();
640
641 // Fill in any missing values in the $dataValues array
642 $testCurrentIndex = 0;
643 foreach($dataValues as $k => $dataValue) {
644 while($k != $testCurrentIndex) {
645 $dataValues[$testCurrentIndex] = null;
646 ++$testCurrentIndex;
647 }
648 ++$testCurrentIndex;
649 }
650
651 if ($dimensions == '3d') {
652 $seriesPlot = new PiePlot3D($dataValues);
653 } else {
654 if ($doughnut) {
655 $seriesPlot = new PiePlotC($dataValues);
656 } else {
657 $seriesPlot = new PiePlot($dataValues);
658 }
659 }
660
661 if ($multiplePlots) {
662 $seriesPlot->SetSize(($jLimit-$j) / ($jLimit * 4));
663 }
664
665 if ($doughnut) {
666 $seriesPlot->SetMidColor('white');
667 }
668
669 $seriesPlot->SetColor(self::$_colourSet[self::$_plotColour++]);
670 if (count($datasetLabels) > 0)
671 $seriesPlot->SetLabels(array_fill(0,count($datasetLabels),''));
672 if ($dimensions != '3d') {
673 $seriesPlot->SetGuideLines(false);
674 }
675 if ($j == 0) {
676 if ($exploded) {
677 $seriesPlot->ExplodeAll();
678 }
679 $seriesPlot->SetLegends($datasetLabels);
680 }
681
682 $this->_graph->Add($seriesPlot);
683 }
684 }
685 } // function _renderPieChart()
686
687
688 private function _renderRadarChart($groupCount) {
689 require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_radar.php');
690
691 $this->_renderRadarPlotArea();
692
693 for($groupID = 0; $groupID < $groupCount; ++$groupID) {
694 $this->_renderPlotRadar($groupID);
695 }
696 } // function _renderRadarChart()
697
698
699 private function _renderStockChart($groupCount) {
700 require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_stock.php');
701
702 $this->_renderCartesianPlotArea('intint');
703
704 for($groupID = 0; $groupID < $groupCount; ++$groupID) {
705 $this->_renderPlotStock($groupID);
706 }
707 } // function _renderStockChart()
708
709
710 private function _renderContourChart($groupCount,$dimensions) {
711 require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_contour.php');
712
713 $this->_renderCartesianPlotArea('intint');
714
715 for($i = 0; $i < $groupCount; ++$i) {
716 $this->_renderPlotContour($i);
717 }
718 } // function _renderContourChart()
719
720
721 private function _renderCombinationChart($groupCount,$dimensions,$outputDestination) {
722 require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_line.php');
723 require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_bar.php');
724 require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_scatter.php');
725 require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_regstat.php');
726 require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_line.php');
727
729
730 for($i = 0; $i < $groupCount; ++$i) {
731 $dimensions = null;
732 $chartType = $this->_chart->getPlotArea()->getPlotGroupByIndex($i)->getPlotType();
733 switch ($chartType) {
734 case 'area3DChart' :
735 $dimensions = '3d';
736 case 'areaChart' :
737 $this->_renderPlotLine($i,True,True,$dimensions);
738 break;
739 case 'bar3DChart' :
740 $dimensions = '3d';
741 case 'barChart' :
742 $this->_renderPlotBar($i,$dimensions);
743 break;
744 case 'line3DChart' :
745 $dimensions = '3d';
746 case 'lineChart' :
747 $this->_renderPlotLine($i,False,True,$dimensions);
748 break;
749 case 'scatterChart' :
750 $this->_renderPlotScatter($i,false);
751 break;
752 case 'bubbleChart' :
753 $this->_renderPlotScatter($i,true);
754 break;
755 default :
756 $this->_graph = null;
757 return false;
758 }
759 }
760
761 $this->_renderLegend();
762
763 $this->_graph->Stroke($outputDestination);
764 return true;
765 } // function _renderCombinationChart()
766
767
768 public function render($outputDestination) {
769 self::$_plotColour = 0;
770
771 $groupCount = $this->_chart->getPlotArea()->getPlotGroupCount();
772
773 $dimensions = null;
774 if ($groupCount == 1) {
775 $chartType = $this->_chart->getPlotArea()->getPlotGroupByIndex(0)->getPlotType();
776 } else {
777 $chartTypes = array();
778 for($i = 0; $i < $groupCount; ++$i) {
779 $chartTypes[] = $this->_chart->getPlotArea()->getPlotGroupByIndex($i)->getPlotType();
780 }
781 $chartTypes = array_unique($chartTypes);
782 if (count($chartTypes) == 1) {
783 $chartType = array_pop($chartTypes);
784 } elseif (count($chartTypes) == 0) {
785 echo 'Chart is not yet implemented<br />';
786 return false;
787 } else {
788 return $this->_renderCombinationChart($groupCount,$dimensions,$outputDestination);
789 }
790 }
791
792 switch ($chartType) {
793 case 'area3DChart' :
794 $dimensions = '3d';
795 case 'areaChart' :
796 $this->_renderAreaChart($groupCount,$dimensions);
797 break;
798 case 'bar3DChart' :
799 $dimensions = '3d';
800 case 'barChart' :
801 $this->_renderBarChart($groupCount,$dimensions);
802 break;
803 case 'line3DChart' :
804 $dimensions = '3d';
805 case 'lineChart' :
806 $this->_renderLineChart($groupCount,$dimensions);
807 break;
808 case 'pie3DChart' :
809 $dimensions = '3d';
810 case 'pieChart' :
811 $this->_renderPieChart($groupCount,$dimensions,False,False);
812 break;
813 case 'doughnut3DChart' :
814 $dimensions = '3d';
815 case 'doughnutChart' :
816 $this->_renderPieChart($groupCount,$dimensions,True,True);
817 break;
818 case 'scatterChart' :
819 $this->_renderScatterChart($groupCount);
820 break;
821 case 'bubbleChart' :
822 $this->_renderBubbleChart($groupCount);
823 break;
824 case 'radarChart' :
825 $this->_renderRadarChart($groupCount);
826 break;
827 case 'surface3DChart' :
828 $dimensions = '3d';
829 case 'surfaceChart' :
830 $this->_renderContourChart($groupCount,$dimensions);
831 break;
832 case 'stockChart' :
833 $this->_renderStockChart($groupCount,$dimensions);
834 break;
835 default :
836 echo $chartType.' is not yet implemented<br />';
837 return false;
838 }
839 $this->_renderLegend();
840
841 $this->_graph->Stroke($outputDestination);
842 return true;
843 } // function render()
844
845
850 {
851 $this->_graph = null;
852 $this->_chart = $chart;
853 } // function __construct()
854
855} // PHPExcel_Chart_Renderer_jpgraph
An exception for terminatinating execution or to throw for unit testing.
_percentageAdjustValues($dataValues, $sumValues)
Definition: jpgraph.php:151
_renderPlotScatter($groupID, $bubble)
Definition: jpgraph.php:414
_renderAreaChart($groupCount, $dimensions='2d')
Definition: jpgraph.php:556
_renderPiePlotArea($doughnut=False)
Definition: jpgraph.php:251
_renderBarChart($groupCount, $dimensions='2d')
Definition: jpgraph.php:578
_percentageSumCalculation($groupID, $seriesCount)
Definition: jpgraph.php:130
_renderContourChart($groupCount, $dimensions)
Definition: jpgraph.php:710
_getCaption($captionElement)
Definition: jpgraph.php:160
_renderPlotBar($groupID, $dimensions='2d')
Definition: jpgraph.php:329
render($outputDestination)
Definition: jpgraph.php:768
_renderPieChart($groupCount, $dimensions='2d', $doughnut=False, $multiplePlots=False)
Definition: jpgraph.php:613
__construct(PHPExcel_Chart $chart)
Create a new PHPExcel_Chart_Renderer_jpgraph.
Definition: jpgraph.php:849
_renderPlotLine($groupID, $filled=false, $combination=false, $dimensions='2d')
Definition: jpgraph.php:266
_renderLineChart($groupCount, $dimensions='2d')
Definition: jpgraph.php:567
_renderCombinationChart($groupCount, $dimensions, $outputDestination)
Definition: jpgraph.php:721
_formatDataSetLabels($groupID, $datasetLabels, $labelCount, $rotation='')
Definition: jpgraph.php:101
_renderCartesianPlotArea($type='textlin')
Definition: jpgraph.php:214
_renderScatterChart($groupCount)
Definition: jpgraph.php:589
_formatPointMarker($seriesPlot, $markerID)
Definition: jpgraph.php:74
static getChartRendererPath()
Return the directory path to the Chart Rendering Library that PHPExcel is currently configured to use...
Definition: Settings.php:270
static toFormattedString($value='0', $format=PHPExcel_Style_NumberFormat::FORMAT_GENERAL, $callBack=null)
Convert a value in a pre-defined format to a PHP string.