AutorÃa | Ultima modificación | Ver Log |
<?php/*pBubble - class to draw bubble chartsVersion : 2.1.4Made by : Jean-Damien POGOLOTTILast Update : 19/01/2014This file can be distributed under the license you can find at :http://www.pchart.net/licenseYou can find the whole class documentation on the pChart web site.*/define("BUBBLE_SHAPE_ROUND", 700001);define("BUBBLE_SHAPE_SQUARE", 700002);/* pBubble class definition */class pBubble{var $pChartObject;var $pDataObject;/* Class creator */function __construct($pChartObject, $pDataObject){$this->pChartObject = $pChartObject;$this->pDataObject = $pDataObject;}/* Prepare the scale */function bubbleScale($DataSeries, $WeightSeries){(!is_array($DataSeries)) AND $DataSeries = [$DataSeries];(!is_array($WeightSeries)) AND $WeightSeries = [$WeightSeries];/* Parse each data series to find the new min & max boundaries to scale */$NewPositiveSerie = [];$NewNegativeSerie = [];$MaxValues = 0;$LastPositive = 0;$LastNegative = 0;foreach($DataSeries as $Key => $SerieName) {$SerieWeightName = $WeightSeries[$Key];$this->pDataObject->setSerieDrawable($SerieWeightName, FALSE);if (count($this->pDataObject->Data["Series"][$SerieName]["Data"]) > $MaxValues) {$MaxValues = count($this->pDataObject->Data["Series"][$SerieName]["Data"]);}foreach($this->pDataObject->Data["Series"][$SerieName]["Data"] as $Key => $Value) {if ($Value >= 0) {$BubbleBounds = $Value + $this->pDataObject->Data["Series"][$SerieWeightName]["Data"][$Key];if (!isset($NewPositiveSerie[$Key])) {$NewPositiveSerie[$Key] = $BubbleBounds;} elseif ($NewPositiveSerie[$Key] < $BubbleBounds) {$NewPositiveSerie[$Key] = $BubbleBounds;}$LastPositive = $BubbleBounds;} else {$BubbleBounds = $Value - $this->pDataObject->Data["Series"][$SerieWeightName]["Data"][$Key];if (!isset($NewNegativeSerie[$Key])) {$NewNegativeSerie[$Key] = $BubbleBounds;} elseif ($NewNegativeSerie[$Key] > $BubbleBounds) {$NewNegativeSerie[$Key] = $BubbleBounds;}$LastNegative = $BubbleBounds;}}}/* Check for missing values and all the fake positive serie */if (count($NewPositiveSerie) > 0) //if ( $NewPositiveSerie != "" ){for ($i = 0; $i < $MaxValues; $i++) {if (!isset($NewPositiveSerie[$i])) {$NewPositiveSerie[$i] = $LastPositive;}}$this->pDataObject->addPoints($NewPositiveSerie, "BubbleFakePositiveSerie");}/* Check for missing values and all the fake negative serie */if (count($NewNegativeSerie) > 0) // if ( $NewNegativeSerie != "" ){for ($i = 0; $i < $MaxValues; $i++) {if (!isset($NewNegativeSerie[$i])) {$NewNegativeSerie[$i] = $LastNegative;}}$this->pDataObject->addPoints($NewNegativeSerie, "BubbleFakeNegativeSerie");}}function resetSeriesColors(){$Data = $this->pDataObject->getData();$Palette = $this->pDataObject->getPalette();$ID = 0;foreach($Data["Series"] as $SerieName => $SeriesParameters) {if ($SeriesParameters["isDrawable"]) {$this->pDataObject->Data["Series"][$SerieName]["Color"] = ["R" => $Palette[$ID]["R"],"G" => $Palette[$ID]["G"],"B" => $Palette[$ID]["B"],"Alpha" => $Palette[$ID]["Alpha"]];$ID++;}}}/* Prepare the scale */function drawBubbleChart($DataSeries, $WeightSeries, array $Format = []){$ForceAlpha = VOID;$DrawBorder = TRUE;$BorderWidth = 1;$Shape = BUBBLE_SHAPE_ROUND;$Surrounding = NULL;$BorderR = 0;$BorderG = 0;$BorderB = 0;$BorderAlpha = 30;$RecordImageMap = FALSE;/* Override defaults */extract($Format);(!is_array($DataSeries)) AND $DataSeries = [$DataSeries];(!is_array($WeightSeries)) AND $WeightSeries = [$WeightSeries];$Data = $this->pDataObject->getData();$Palette = $this->pDataObject->getPalette();if (isset($Data["Series"]["BubbleFakePositiveSerie"])) {$this->pDataObject->setSerieDrawable("BubbleFakePositiveSerie", FALSE);}if (isset($Data["Series"]["BubbleFakeNegativeSerie"])) {$this->pDataObject->setSerieDrawable("BubbleFakeNegativeSerie", FALSE);}$this->resetSeriesColors();list($XMargin, $XDivs) = $this->pChartObject->scaleGetXSettings();foreach($DataSeries as $Key => $SerieName) {$AxisID = $Data["Series"][$SerieName]["Axis"];$Mode = $Data["Axis"][$AxisID]["Display"];$Format = $Data["Axis"][$AxisID]["Format"];$Unit = $Data["Axis"][$AxisID]["Unit"];$SerieDescription = (isset($Data["Series"][$SerieName]["Description"])) ? $Data["Series"][$SerieName]["Description"] : $SerieName;$XStep = ($this->pChartObject->GraphAreaX2 - $this->pChartObject->GraphAreaX1 - $XMargin * 2) / $XDivs;$X = $this->pChartObject->GraphAreaX1 + $XMargin;$Y = $this->pChartObject->GraphAreaY1 + $XMargin;$Color = ["R" => $Palette[$Key]["R"],"G" => $Palette[$Key]["G"],"B" => $Palette[$Key]["B"],"Alpha" => $Palette[$Key]["Alpha"]];if ($ForceAlpha != VOID) {$Color["Alpha"] = $ForceAlpha;}if ($DrawBorder) {if ($BorderWidth != 1) {if ($Surrounding != NULL) {$BorderR = $Palette[$Key]["R"] + $Surrounding;$BorderG = $Palette[$Key]["G"] + $Surrounding;$BorderB = $Palette[$Key]["B"] + $Surrounding;} else {$BorderR = $BorderR;$BorderG = $BorderG;$BorderB = $BorderB;}if ($ForceAlpha != VOID) {$BorderAlpha = $ForceAlpha / 2;}$BorderColor = ["R" => $BorderR,"G" => $BorderG,"B" => $BorderB,"Alpha" => $BorderAlpha];} else {$Color["BorderAlpha"] = $BorderAlpha;if ($Surrounding != NULL) {$Color["BorderR"] = $Palette[$Key]["R"] + $Surrounding;$Color["BorderG"] = $Palette[$Key]["G"] + $Surrounding;$Color["BorderB"] = $Palette[$Key]["B"] + $Surrounding;} else {$Color["BorderR"] = $BorderR;$Color["BorderG"] = $BorderG;$Color["BorderB"] = $BorderB;}if ($ForceAlpha != VOID) {$Color["BorderAlpha"] = $ForceAlpha / 2;}}}foreach($Data["Series"][$SerieName]["Data"] as $iKey => $Point) {$Weight = $Point + $Data["Series"][$WeightSeries[$Key]]["Data"][$iKey];$PosArray = $this->pChartObject->scaleComputeY($Point, ["AxisID" => $AxisID]);$WeightArray = $this->pChartObject->scaleComputeY($Weight, ["AxisID" => $AxisID]);if ($Data["Orientation"] == SCALE_POS_LEFTRIGHT) {$XStep = ($XDivs == 0) ? 0 : ($this->pChartObject->GraphAreaX2 - $this->pChartObject->GraphAreaX1 - $XMargin * 2) / $XDivs;$Y = floor($PosArray);$CircleRadius = floor(abs($PosArray - $WeightArray) / 2);if ($Shape == BUBBLE_SHAPE_SQUARE) {if ($RecordImageMap) {$this->pChartObject->addToImageMap("RECT", floor($X - $CircleRadius) . "," . floor($Y - $CircleRadius) . "," . floor($X + $CircleRadius) . "," . floor($Y + $CircleRadius) , $this->pChartObject->toHTMLColor($Palette[$Key]["R"], $Palette[$Key]["G"], $Palette[$Key]["B"]) , $SerieDescription, $Data["Series"][$WeightSeries[$Key]]["Data"][$iKey]);}if ($BorderWidth != 1) {$this->pChartObject->drawFilledRectangle($X - $CircleRadius - $BorderWidth, $Y - $CircleRadius - $BorderWidth, $X + $CircleRadius + $BorderWidth, $Y + $CircleRadius + $BorderWidth, $BorderColor);$this->pChartObject->drawFilledRectangle($X - $CircleRadius, $Y - $CircleRadius, $X + $CircleRadius, $Y + $CircleRadius, $Color);} else {$this->pChartObject->drawFilledRectangle($X - $CircleRadius, $Y - $CircleRadius, $X + $CircleRadius, $Y + $CircleRadius, $Color);}} elseif ($Shape == BUBBLE_SHAPE_ROUND) {if ($RecordImageMap) {$this->pChartObject->addToImageMap("CIRCLE", floor($X) . "," . floor($Y) . "," . floor($CircleRadius) , $this->pChartObject->toHTMLColor($Palette[$Key]["R"], $Palette[$Key]["G"], $Palette[$Key]["B"]) , $SerieDescription, $Data["Series"][$WeightSeries[$Key]]["Data"][$iKey]);}if ($BorderWidth != 1) {$this->pChartObject->drawFilledCircle($X, $Y, $CircleRadius + $BorderWidth, $BorderColor);$this->pChartObject->drawFilledCircle($X, $Y, $CircleRadius, $Color);} else {$this->pChartObject->drawFilledCircle($X, $Y, $CircleRadius, $Color);}}$X = $X + $XStep;} elseif ($Data["Orientation"] == SCALE_POS_TOPBOTTOM) {if ($XDivs == 0) {$XStep = 0;} else {$XStep = ($this->pChartObject->GraphAreaY2 - $this->pChartObject->GraphAreaY1 - $XMargin * 2) / $XDivs;}$X = floor($PosArray);$CircleRadius = floor(abs($PosArray - $WeightArray) / 2);if ($Shape == BUBBLE_SHAPE_SQUARE) {if ($RecordImageMap) {$this->pChartObject->addToImageMap("RECT", floor($X - $CircleRadius) . "," . floor($Y - $CircleRadius) . "," . floor($X + $CircleRadius) . "," . floor($Y + $CircleRadius) , $this->pChartObject->toHTMLColor($Palette[$Key]["R"], $Palette[$Key]["G"], $Palette[$Key]["B"]) , $SerieDescription, $Data["Series"][$WeightSeries[$Key]]["Data"][$iKey]);}if ($BorderWidth != 1) {$this->pChartObject->drawFilledRectangle($X - $CircleRadius - $BorderWidth, $Y - $CircleRadius - $BorderWidth, $X + $CircleRadius + $BorderWidth, $Y + $CircleRadius + $BorderWidth, $BorderColor);$this->pChartObject->drawFilledRectangle($X - $CircleRadius, $Y - $CircleRadius, $X + $CircleRadius, $Y + $CircleRadius, $Color);} else {$this->pChartObject->drawFilledRectangle($X - $CircleRadius, $Y - $CircleRadius, $X + $CircleRadius, $Y + $CircleRadius, $Color);}} elseif ($Shape == BUBBLE_SHAPE_ROUND) {if ($RecordImageMap) {$this->pChartObject->addToImageMap("CIRCLE", floor($X) . "," . floor($Y) . "," . floor($CircleRadius) , $this->pChartObject->toHTMLColor($Palette[$Key]["R"], $Palette[$Key]["G"], $Palette[$Key]["B"]) , $SerieDescription, $Data["Series"][$WeightSeries[$Key]]["Data"][$iKey]);}if ($BorderWidth != 1) {$this->pChartObject->drawFilledCircle($X, $Y, $CircleRadius + $BorderWidth, $BorderColor);$this->pChartObject->drawFilledCircle($X, $Y, $CircleRadius, $Color);} else {$this->pChartObject->drawFilledCircle($X, $Y, $CircleRadius, $Color);}}$Y = $Y + $XStep;}}}}function writeBubbleLabel($SerieName, $SerieWeightName, $Points, array $Format = []){$Data = $this->pDataObject->getData();$Palette = $this->pDataObject->getPalette();if (!isset($Data["Series"][$SerieName]) || !isset($Data["Series"][$SerieWeightName])) {return 0;}$OverrideTitle = isset($Format["OverrideTitle"]) ? $Format["OverrideTitle"] : NULL;$DrawPoint = isset($Format["DrawPoint"]) ? $Format["DrawPoint"] : LABEL_POINT_BOX;(!is_array($Points)) AND $Points = [$Points];list($XMargin, $XDivs) = $this->pChartObject->scaleGetXSettings();$AxisID = $Data["Series"][$SerieName]["Axis"];$AxisMode = $Data["Axis"][$AxisID]["Display"];$AxisFormat = $Data["Axis"][$AxisID]["Format"];$AxisUnit = $Data["Axis"][$AxisID]["Unit"];$XStep = ($this->pChartObject->GraphAreaX2 - $this->pChartObject->GraphAreaX1 - $XMargin * 2) / $XDivs;$X = $this->pChartObject->GraphAreaX1 + $XMargin;$Y = $this->pChartObject->GraphAreaY1 + $XMargin;$Color = ["R" => $Data["Series"][$SerieName]["Color"]["R"],"G" => $Data["Series"][$SerieName]["Color"]["G"],"B" => $Data["Series"][$SerieName]["Color"]["B"],"Alpha" => $Data["Series"][$SerieName]["Color"]["Alpha"]];foreach($Points as $Key => $Point) {$Value = $Data["Series"][$SerieName]["Data"][$Point];$PosArray = $this->pChartObject->scaleComputeY($Value, ["AxisID" => $AxisID]);if (isset($Data["Abscissa"]) && isset($Data["Series"][$Data["Abscissa"]]["Data"][$Point])) {$Abscissa = $Data["Series"][$Data["Abscissa"]]["Data"][$Point] . " : ";} else {$Abscissa = "";}$Value = $this->pChartObject->scaleFormat($Value, $AxisMode, $AxisFormat, $AxisUnit);$Weight = $Data["Series"][$SerieWeightName]["Data"][$Point];$Caption = $Abscissa . $Value . " / " . $Weight;$Description = (isset($Data["Series"][$SerieName]["Description"])) ? $Data["Series"][$SerieName]["Description"] : "No description";$Series = ["Format" => $Color,"Caption" => $Caption];if ($Data["Orientation"] == SCALE_POS_LEFTRIGHT) {$XStep = ($XDivs == 0) ? 0 : ($this->pChartObject->GraphAreaX2 - $this->pChartObject->GraphAreaX1 - $XMargin * 2) / $XDivs;$X = floor($X + $Point * $XStep);$Y = floor($PosArray);} else {$YStep = ($XDivs == 0) ? 0 :($this->pChartObject->GraphAreaY2 - $this->pChartObject->GraphAreaY1 - $XMargin * 2) / $XDivs;$X = floor($PosArray);$Y = floor($Y + $Point * $YStep);}if ($DrawPoint == LABEL_POINT_CIRCLE) {$this->pChartObject->drawFilledCircle($X, $Y, 3, ["R" => 255,"G" => 255,"B" => 255,"BorderR" => 0,"BorderG" => 0,"BorderB" => 0]);} elseif ($DrawPoint == LABEL_POINT_BOX) {$this->pChartObject->drawFilledRectangle($X - 2, $Y - 2, $X + 2, $Y + 2, ["R" => 255,"G" => 255,"B" => 255,"BorderR" => 0, "BorderG" => 0, "BorderB" => 0]);}$this->pChartObject->drawLabelBox($X, $Y - 3, $Description, $Series, $Format);}}}?>