public function testRemoveSeries() { $data = new pData(); $data->addPoint(array(1, 2), 'testseries1'); $data->addPoint(array(3, 4), 'testseries2'); $data->addSeries('testseries1'); $data->addSeries('testseries2'); $this->assertEquals(array('Position' => 'Name', 'Format' => array('X' => 'number', 'Y' => 'number'), 'Unit' => array('X' => null, 'Y' => null), 'Values' => array('testseries1', 'testseries2')), $data->getDataDescription()); $data->removeSeries('testseries1'); $this->assertEquals(array('Position' => 'Name', 'Format' => array('X' => 'number', 'Y' => 'number'), 'Unit' => array('X' => null, 'Y' => null), 'Values' => array(1 => 'testseries2')), $data->getDataDescription()); }
public function testRemoveSeries() { $data = new pData(); $data->addPoints(array(1, 2), 'testseries1'); $data->addPoints(array(3, 4), 'testseries2'); $data->addSeries('testseries1'); $data->addSeries('testseries2'); $this->assertEquals(array('testseries1', 'testseries2'), $data->getDataDescription()->values); $this->assertEquals(null, $data->getDataDescription()->description); $data->removeSeries('testseries1'); $this->assertEquals(array(1 => 'testseries2'), $data->getDataDescription()->values); }
public function testDrawBasicPieGraph() { // Dataset definition $DataSet = new pData(); $DataSet->addPoints(array(10, 2, 3, 5, 3), "Serie1"); $DataSet->addPoints(array("Jan", "Feb", "Mar", "Apr", "May"), "Serie2"); $DataSet->AddAllSeries(); $DataSet->setAbscissaLabelSeries("Serie2"); $this->assertEquals(array(0 => array('Serie1' => 10, 'Name' => 0, 'Serie2' => 'Jan'), 1 => array('Serie1' => 2, 'Name' => 1, 'Serie2' => 'Feb'), 2 => array('Serie1' => 3, 'Name' => 2, 'Serie2' => 'Mar'), 3 => array('Serie1' => 5, 'Name' => 3, 'Serie2' => 'Apr'), 4 => array('Serie1' => 3, 'Name' => 4, 'Serie2' => 'May')), $DataSet->getData()); $this->assertEquals(array(0 => 'Serie1', 1 => 'Serie2'), $DataSet->getDataDescription()->values); // Initialise the graph $canvas = new TestCanvas(); $Test = new PieChart(300, 200, $canvas); $Test->loadColorPalette(dirname(__FILE__) . "/../sample/softtones.txt"); // Draw the pie chart $Test->setFontProperties("Fonts/tahoma.ttf", 8); $Test->drawBasicPieGraph($DataSet->GetData(), $DataSet->GetDataDescription(), 120, 100, ShadowProperties::NoShadow(), 70, PIE_PERCENTAGE, new Color(255, 255, 218)); $Test->drawPieLegend(230, 15, $DataSet->GetData(), $DataSet->GetDataDescription(), new Color(250)); $this->assertEquals('0ec1d5de67ae53239101143106d5ee4a', md5($canvas->getActionLog())); }
/** * This function draw a pseudo-3D pie chart * @param pData * @param int X-Position of the Center * @param int Y-Position of the Center * @param int Radius of the cake * @param const int Draw the Labels to the pies? PIE_LABELS, PIE_NOLABEL, PIE_PERCENTAGE, PIE_PERCENATGE_LABEL * @param bool Enhance colors? * @param int Skew * @param int Height of the splices * @param int Distance between the splices * @param int number of decimals * @param ShadowProperties * @access public */ public function drawPieGraph(pData $data, $XPos, $YPos, $Radius = 100, $DrawLabels = PIE_NOLABEL, $EnhanceColors = TRUE, $Skew = 60, $SpliceHeight = 20, $SpliceDistance = 0, $Decimals = 0, ShadowProperties $shadowProperties = null) { if ($shadowProperties == null) { $shadowProperties = ShadowProperties::FromDefaults(); } /* Validate the Data and DataDescription array */ $this->validateDataDescription("drawPieGraph", $data->getDataDescription(), FALSE); $this->validateData("drawPieGraph", $data->getData()); /* Determine pie sum */ $Series = 0; $PieSum = 0; $rPieSum = 0; foreach ($data->getDataDescription()->values as $ColName) { if ($ColName != $data->getDataDescription()->getPosition()) { $Series++; $dataArray = $data->getData(); foreach (array_keys($dataArray) as $Key) { if (isset($dataArray[$Key][$ColName])) { if ($dataArray[$Key][$ColName] == 0) { $iValues[] = 0; $rValues[] = 0; $iLabels[] = $dataArray[$Key][$data->getDataDescription()->getPosition()]; } else { $PieSum += $dataArray[$Key][$ColName]; $iValues[] = $dataArray[$Key][$ColName]; $iLabels[] = $dataArray[$Key][$data->getDataDescription()->getPosition()]; $rValues[] = $dataArray[$Key][$ColName]; $rPieSum += $dataArray[$Key][$ColName]; } } } } } /* Validate serie */ if ($Series != 1) { throw new Exception("Pie chart can only accept one serie of data."); } /** @todo Proper exception type needed here */ $SpliceDistanceRatio = $SpliceDistance; $SkewHeight = $Radius * $Skew / 100; $SpliceRatio = (360 - $SpliceDistanceRatio * count($iValues)) / $PieSum; $SplicePercent = 100 / $PieSum; $rSplicePercent = 100 / $rPieSum; /* Calculate all polygons */ $Angle = 0; $CDev = 5; $TopPlots = ""; $BotPlots = ""; $aTopPlots = ""; $aBotPlots = ""; foreach ($iValues as $Key => $Value) { $XCenterPos = cos(($Angle - $CDev + ($Value * $SpliceRatio + $SpliceDistanceRatio) / 2) * M_PI / 180) * $SpliceDistance + $XPos; $YCenterPos = sin(($Angle - $CDev + ($Value * $SpliceRatio + $SpliceDistanceRatio) / 2) * M_PI / 180) * $SpliceDistance + $YPos; $XCenterPos2 = cos(($Angle + $CDev + ($Value * $SpliceRatio + $SpliceDistanceRatio) / 2) * M_PI / 180) * $SpliceDistance + $XPos; $YCenterPos2 = sin(($Angle + $CDev + ($Value * $SpliceRatio + $SpliceDistanceRatio) / 2) * M_PI / 180) * $SpliceDistance + $YPos; $TopPlots[$Key][] = round($XCenterPos); $BotPlots[$Key][] = round($XCenterPos); $TopPlots[$Key][] = round($YCenterPos); $BotPlots[$Key][] = round($YCenterPos + $SpliceHeight); $aTopPlots[$Key][] = $XCenterPos; $aBotPlots[$Key][] = $XCenterPos; $aTopPlots[$Key][] = $YCenterPos; $aBotPlots[$Key][] = $YCenterPos + $SpliceHeight; /* Process labels position & size */ $Caption = ""; if (!($DrawLabels == PIE_NOLABEL)) { $TAngle = $Angle + $Value * $SpliceRatio / 2; if ($DrawLabels == PIE_PERCENTAGE) { $Caption = round($rValues[$Key] * pow(10, $Decimals) * $rSplicePercent) / pow(10, $Decimals) . "%"; } elseif ($DrawLabels == PIE_LABELS) { $Caption = $iLabels[$Key]; } elseif ($DrawLabels == PIE_PERCENTAGE_LABEL) { $Caption = $iLabels[$Key] . "\r\n" . round($Value * pow(10, $Decimals) * $SplicePercent) / pow(10, $Decimals) . "%"; } $Position = imageftbbox($this->FontSize, 0, $this->FontName, $Caption); $TextWidth = $Position[2] - $Position[0]; $TextHeight = abs($Position[1]) + abs($Position[3]); $TX = cos($TAngle * M_PI / 180) * ($Radius + 10) + $XPos; if ($TAngle > 0 && $TAngle < 180) { $TY = sin($TAngle * M_PI / 180) * ($SkewHeight + 10) + $YPos + $SpliceHeight + 4; } else { $TY = sin($TAngle * M_PI / 180) * ($SkewHeight + 4) + $YPos - $TextHeight / 2; } if ($TAngle > 90 && $TAngle < 270) { $TX = $TX - $TextWidth; } $this->canvas->drawText($this->FontSize, 0, new Point($TX, $TY), new Color(70, 70, 70), $this->FontName, $Caption, $shadowProperties); } /* Process pie slices */ for ($iAngle = $Angle; $iAngle <= $Angle + $Value * $SpliceRatio; $iAngle = $iAngle + 0.5) { $TopX = cos($iAngle * M_PI / 180) * $Radius + $XPos; $TopY = sin($iAngle * M_PI / 180) * $SkewHeight + $YPos; $TopPlots[$Key][] = round($TopX); $BotPlots[$Key][] = round($TopX); $TopPlots[$Key][] = round($TopY); $BotPlots[$Key][] = round($TopY + $SpliceHeight); $aTopPlots[$Key][] = $TopX; $aBotPlots[$Key][] = $TopX; $aTopPlots[$Key][] = $TopY; $aBotPlots[$Key][] = $TopY + $SpliceHeight; } $TopPlots[$Key][] = round($XCenterPos2); $BotPlots[$Key][] = round($XCenterPos2); $TopPlots[$Key][] = round($YCenterPos2); $BotPlots[$Key][] = round($YCenterPos2 + $SpliceHeight); $aTopPlots[$Key][] = $XCenterPos2; $aBotPlots[$Key][] = $XCenterPos2; $aTopPlots[$Key][] = $YCenterPos2; $aBotPlots[$Key][] = $YCenterPos2 + $SpliceHeight; $Angle = $iAngle + $SpliceDistanceRatio; } $this->drawPieGraphBottomPolygons($iValues, $BotPlots, $EnhanceColors, $aBotPlots, $shadowProperties); $this->drawPieGraphLayers($iValues, $TopPlots, $EnhanceColors, $SpliceHeight, $this->palette, $shadowProperties); $this->drawPieGraphTopPolygons($iValues, $TopPlots, $EnhanceColors, $aTopPlots, $shadowProperties); }
/** * This function draw a filled cubic curve */ function drawFilledCubicCurve(pData $data, $Accuracy = 0.1, $Alpha = 100, $AroundZero = FALSE) { /* Validate the Data and DataDescription array */ $this->validateDataDescription("drawFilledCubicCurve", $data->getDataDescription()); $this->validateData("drawFilledCubicCurve", $data->getData()); $LayerWidth = $this->GArea_X2 - $this->GArea_X1; $LayerHeight = $this->GArea_Y2 - $this->GArea_Y1; $YZero = $LayerHeight - (0 - $this->VMin) * $this->DivisionRatio; if ($YZero > $LayerHeight) { $YZero = $LayerHeight; } $GraphID = 0; foreach ($data->getDataDescription()->values as $ColName) { $XIn = array(); $YIn = array(); $Yt = array(); $U = array(); $ColorID = $data->getDataDescription()->getColumnIndex($ColName); $numElements = 1; $XLast = -1; $Missing = array(); $data->getXYMap($ColName, $XIn, $YIn, $Missing, $numElements); $Yt[0] = 0; $Yt[1] = 0; $U[1] = 0; $this->calculateCubicCurve($Yt, $XIn, $YIn, $U, $numElements); $Yt[$numElements] = 0; for ($k = $numElements - 1; $k >= 1; $k--) { $Yt[$k] = $Yt[$k] * $Yt[$k + 1] + $U[$k]; } $Points = ""; $Points[] = $this->GAreaXOffset + $this->GArea_X1; $Points[] = $LayerHeight + $this->GArea_Y1; $YLast = NULL; $XPos = $this->GAreaXOffset; $PointsCount = 2; for ($X = 1; $X <= $numElements; $X = $X + $Accuracy) { $klo = 1; $khi = $numElements; $k = $khi - $klo; while ($k > 1) { $k = $khi - $klo; if ($XIn[$k] >= $X) { $khi = $k; } else { $klo = $k; } } $klo = $khi - 1; $h = $XIn[$khi] - $XIn[$klo]; $a = ($XIn[$khi] - $X) / $h; $b = ($X - $XIn[$klo]) / $h; $Value = $a * $YIn[$klo] + $b * $YIn[$khi] + (($a * $a * $a - $a) * $Yt[$klo] + ($b * $b * $b - $b) * $Yt[$khi]) * ($h * $h) / 6; $YPos = $LayerHeight - ($Value - $this->VMin) * $this->DivisionRatio; if ($YLast != NULL && $AroundZero && !isset($Missing[floor($X)]) && !isset($Missing[floor($X + 1)])) { $aPoints = ""; $aPoints[] = $XLast + $this->GArea_X1; $aPoints[] = min($YLast + $this->GArea_Y1, $this->GArea_Y2); $aPoints[] = $XPos + $this->GArea_X1; $aPoints[] = min($YPos + $this->GArea_Y1, $this->GArea_Y2); $aPoints[] = $XPos + $this->GArea_X1; $aPoints[] = $YZero + $this->GArea_Y1; $aPoints[] = $XLast + $this->GArea_X1; $aPoints[] = $YZero + $this->GArea_Y1; $this->canvas->drawFilledPolygon($aPoints, 4, $this->palette->getColor($ColorID), $alpha); } if (!isset($Missing[floor($X)]) || $YLast == NULL) { $PointsCount++; $Points[] = $XPos + $this->GArea_X1; $Points[] = min($YPos + $this->GArea_Y1, $this->GArea_Y2); } else { $PointsCount++; $Points[] = $XLast + $this->GArea_X1; $Points[] = min($LayerHeight + $this->GArea_Y1, $this->GArea_Y2); } $YLast = $YPos; $XLast = $XPos; $XPos = $XPos + $this->DivisionWidth * $Accuracy; } // Add potentialy missing values $XPos = $XPos - $this->DivisionWidth * $Accuracy; if ($XPos < $LayerWidth - $this->GAreaXOffset) { $YPos = $LayerHeight - ($YIn[$numElements] - $this->VMin) * $this->DivisionRatio; if ($YLast != NULL && $AroundZero) { $aPoints = ""; $aPoints[] = $XLast + $this->GArea_X1; $aPoints[] = max($YLast + $this->GArea_Y1, $this->GArea_Y1); $aPoints[] = $LayerWidth - $this->GAreaXOffset + $this->GArea_X1; $aPoints[] = max($YPos + $this->GArea_Y1, $this->GArea_Y1); $aPoints[] = $LayerWidth - $this->GAreaXOffset + $this->GArea_X1; $aPoints[] = max($YZero + $this->GArea_Y1, $this->GArea_Y1); $aPoints[] = $XLast + $this->GArea_X1; $aPoints[] = max($YZero + $this->GArea_Y1, $this->GArea_Y1); $this->canvas->drawFilledPolygon($aPoints, 4, $this->palette->getColor($ColorID), $alpha); } if ($YIn[$klo] != "" && $YIn[$khi] != "" || $YLast == NULL) { $PointsCount++; $Points[] = $LayerWidth - $this->GAreaXOffset + $this->GArea_X1; $Points[] = $YPos + $this->GArea_Y1; } } $Points[] = $LayerWidth - $this->GAreaXOffset + $this->GArea_X1; $Points[] = $LayerHeight + $this->GArea_Y1; if (!$AroundZero) { $this->canvas->drawFilledPolygon($Points, $PointsCount, $this->palette->getColor($ColorID), $Alpha); } $this->drawCubicCurve($data, $Accuracy, $ColName); $GraphID++; } }