Heuristic ranking analysis
[contractdashboard.git] / lib / pChart2.1.0 / class / pBubble.class.php
blob:a/lib/pChart2.1.0/class/pBubble.class.php -> blob:b/lib/pChart2.1.0/class/pBubble.class.php
--- a/lib/pChart2.1.0/class/pBubble.class.php
+++ b/lib/pChart2.1.0/class/pBubble.class.php
@@ -1,1 +1,191 @@
-
+<?php

+ /*

+     pBubble - class to draw bubble charts

+

+     Version     : 2.1.0

+     Made by     : Jean-Damien POGOLOTTI

+     Last Update : 26/01/11

+

+     This file can be distributed under the license you can find at :

+

+                       http://www.pchart.net/license

+

+     You can find the whole class documentation on the pChart web site.

+ */

+

+ /* pBubble class definition */

+ class pBubble

+  {

+   var $pChartObject;

+   var $pDataObject;

+

+   /* Class creator */

+   function pBubble($pChartObject,$pDataObject)

+    {

+     $this->pChartObject = $pChartObject;

+     $this->pDataObject  = $pDataObject;

+    }

+

+   /* Prepare the scale */

+   function bubbleScale($DataSeries,$WeightSeries)

+    {

+     if ( !is_array($DataSeries) )	{ $DataSeries = array($DataSeries); }

+     if ( !is_array($WeightSeries) )	{ $WeightSeries = array($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 ( $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 ( $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"];

+         $this->pDataObject->Data["Series"][$SerieName]["Color"]["G"]     = $Palette[$ID]["G"];

+         $this->pDataObject->Data["Series"][$SerieName]["Color"]["B"]     = $Palette[$ID]["B"];

+         $this->pDataObject->Data["Series"][$SerieName]["Color"]["Alpha"] = $Palette[$ID]["Alpha"];

+         $ID++;

+        }

+      }

+    }

+

+   /* Prepare the scale */

+   function drawBubbleChart($DataSeries,$WeightSeries,$Format="")

+    {

+     $DrawBorder	= isset($Format["DrawBorder"]) ? $Format["DrawBorder"] : TRUE;

+     $DrawSquare	= isset($Format["DrawSquare"]) ? $Format["DrawSquare"] : FALSE;

+     $Surrounding	= isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL;

+     $BorderR		= isset($Format["BorderR"]) ? $Format["BorderR"] : 0;

+     $BorderG		= isset($Format["BorderG"]) ? $Format["BorderG"] : 0;

+     $BorderB		= isset($Format["BorderB"]) ? $Format["BorderB"] : 0;

+     $BorderAlpha	= isset($Format["BorderAlpha"]) ? $Format["BorderAlpha"] : 30;

+

+     if ( !is_array($DataSeries) )	{ $DataSeries = array($DataSeries); }

+     if ( !is_array($WeightSeries) )	{ $WeightSeries = array($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"];

+

+       $XStep	= ($this->pChartObject->GraphAreaX2-$this->pChartObject->GraphAreaX1-$XMargin*2)/$XDivs;

+

+       $X = $this->pChartObject->GraphAreaX1 + $XMargin;

+       $Y = $this->pChartObject->GraphAreaY1 + $XMargin;

+

+       $Color = array("R"=>$Palette[$Key]["R"],"G"=>$Palette[$Key]["G"],"B"=>$Palette[$Key]["B"],"Alpha"=>$Palette[$Key]["Alpha"]);

+

+       if ( $DrawBorder )

+        {

+         $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; }

+        }

+

+       foreach($Data["Series"][$SerieName]["Data"] as $iKey => $Point)

+        {

+         $Weight = $Point + $Data["Series"][$WeightSeries[$Key]]["Data"][$iKey];

+

+         $PosArray    = $this->pChartObject->scaleComputeY($Point,array("AxisID"=>$AxisID));

+         $WeightArray = $this->pChartObject->scaleComputeY($Weight,array("AxisID"=>$AxisID));

+

+         if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT )

+          {

+           if ( $XDivs == 0 ) { $XStep = 0; } else { $XStep = ($this->pChartObject->GraphAreaX2-$this->pChartObject->GraphAreaX1-$XMargin*2)/$XDivs; }

+           $Y = floor($PosArray); $CircleRadius = floor(abs($PosArray - $WeightArray)/2);

+

+           if ( $DrawSquare )

+            $this->pChartObject->drawFilledRectangle($X-$CircleRadius,$Y-$CircleRadius,$X+$CircleRadius,$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 ( $DrawSquare )

+            $this->pChartObject->drawFilledRectangle($X-$CircleRadius,$Y-$CircleRadius,$X+$CircleRadius,$Y+$CircleRadius,$Color);

+           else

+            $this->pChartObject->drawFilledCircle($X,$Y,$CircleRadius,$Color);

+

+           $Y = $Y + $XStep;

+          }

+        }

+      }

+    }

+  }

+?>