123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788 |
- <?php
- /*
- pDraw - class to manipulate data arrays
- Version : 2.1.4
- Made by : Jean-Damien POGOLOTTI
- Last Update : 19/01/2014
- 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.
- */
- /* Axis configuration */
- define("AXIS_FORMAT_DEFAULT" , 680001);
- define("AXIS_FORMAT_TIME" , 680002);
- define("AXIS_FORMAT_DATE" , 680003);
- define("AXIS_FORMAT_METRIC" , 680004);
- define("AXIS_FORMAT_CURRENCY" , 680005);
- define("AXIS_FORMAT_TRAFFIC" , 680006);
- define("AXIS_FORMAT_CUSTOM" , 680007);
- /* Axis position */
- define("AXIS_POSITION_LEFT" , 681001);
- define("AXIS_POSITION_RIGHT" , 681002);
- define("AXIS_POSITION_TOP" , 681001);
- define("AXIS_POSITION_BOTTOM" , 681002);
- /* Families of data points */
- define("SERIE_SHAPE_FILLEDCIRCLE" , 681011);
- define("SERIE_SHAPE_FILLEDTRIANGLE" , 681012);
- define("SERIE_SHAPE_FILLEDSQUARE" , 681013);
- define("SERIE_SHAPE_FILLEDDIAMOND" , 681017);
- define("SERIE_SHAPE_CIRCLE" , 681014);
- define("SERIE_SHAPE_TRIANGLE" , 681015);
- define("SERIE_SHAPE_SQUARE" , 681016);
- define("SERIE_SHAPE_DIAMOND" , 681018);
- /* Axis position */
- define("AXIS_X" , 682001);
- define("AXIS_Y" , 682002);
- /* Define value limits */
- define("ABSOLUTE_MIN" , -10000000000000);
- define("ABSOLUTE_MAX" , 10000000000000);
- /* Replacement to the PHP NULL keyword */
- define("VOID" , 0.123456789);
- /* Euro symbol for GD fonts */
- define("EURO_SYMBOL" , utf8_encode("€"));
- /* pData class definition */
- class pData
- {
- var $Data;
- var $Palette = array("0"=>array("R"=>188,"G"=>224,"B"=>46,"Alpha"=>100),
- "1"=>array("R"=>224,"G"=>100,"B"=>46,"Alpha"=>100),
- "2"=>array("R"=>224,"G"=>214,"B"=>46,"Alpha"=>100),
- "3"=>array("R"=>46,"G"=>151,"B"=>224,"Alpha"=>100),
- "4"=>array("R"=>176,"G"=>46,"B"=>224,"Alpha"=>100),
- "5"=>array("R"=>224,"G"=>46,"B"=>117,"Alpha"=>100),
- "6"=>array("R"=>92,"G"=>224,"B"=>46,"Alpha"=>100),
- "7"=>array("R"=>224,"G"=>176,"B"=>46,"Alpha"=>100));
- /* Class creator */
- function pData()
- {
- $this->Data = "";
- $this->Data["XAxisDisplay"] = AXIS_FORMAT_DEFAULT;
- $this->Data["XAxisFormat"] = NULL;
- $this->Data["XAxisName"] = NULL;
- $this->Data["XAxisUnit"] = NULL;
- $this->Data["Abscissa"] = NULL;
- $this->Data["AbsicssaPosition"] = AXIS_POSITION_BOTTOM;
- $this->Data["Axis"][0]["Display"] = AXIS_FORMAT_DEFAULT;
- $this->Data["Axis"][0]["Position"] = AXIS_POSITION_LEFT;
- $this->Data["Axis"][0]["Identity"] = AXIS_Y;
- }
- /* Add a single point or an array to the given serie */
- function addPoints($Values,$SerieName="Serie1")
- {
- if (!isset($this->Data["Series"][$SerieName]))
- $this->initialise($SerieName);
- if ( is_array($Values) )
- {
- foreach($Values as $Key => $Value)
- { $this->Data["Series"][$SerieName]["Data"][] = $Value; }
- }
- else
- $this->Data["Series"][$SerieName]["Data"][] = $Values;
- if ( $Values != VOID )
- {
- $StrippedData = $this->stripVOID($this->Data["Series"][$SerieName]["Data"]);
- if ( empty($StrippedData) ) { $this->Data["Series"][$SerieName]["Max"] = 0; $this->Data["Series"][$SerieName]["Min"] =0; return(0); }
- $this->Data["Series"][$SerieName]["Max"] = max($StrippedData);
- $this->Data["Series"][$SerieName]["Min"] = min($StrippedData);
- }
- }
- /* Strip VOID values */
- function stripVOID($Values)
- { if (!is_array($Values)) { return(array()); } $Result = array(); foreach($Values as $Key => $Value) { if ( $Value != VOID ) { $Result[] = $Value; } } return($Result); }
- /* Return the number of values contained in a given serie */
- function getSerieCount($Serie)
- { if (isset($this->Data["Series"][$Serie]["Data"])) { return(sizeof($this->Data["Series"][$Serie]["Data"])); } else { return(0); } }
- /* Remove a serie from the pData object */
- function removeSerie($Series)
- {
- if ( !is_array($Series) ) { $Series = $this->convertToArray($Series); }
- foreach($Series as $Key => $Serie) { if (isset($this->Data["Series"][$Serie])) { unset($this->Data["Series"][$Serie]); } }
- }
- /* Return a value from given serie & index */
- function getValueAt($Serie,$Index=0)
- { if (isset($this->Data["Series"][$Serie]["Data"][$Index])) { return($this->Data["Series"][$Serie]["Data"][$Index]); } else { return(NULL); } }
- /* Return the values array */
- function getValues($Serie)
- { if (isset($this->Data["Series"][$Serie]["Data"])) { return($this->Data["Series"][$Serie]["Data"]); } else { return(NULL); } }
- /* Reverse the values in the given serie */
- function reverseSerie($Series)
- {
- if ( !is_array($Series) ) { $Series = $this->convertToArray($Series); }
- foreach($Series as $Key => $Serie) { if (isset($this->Data["Series"][$Serie]["Data"])) { $this->Data["Series"][$Serie]["Data"] = array_reverse($this->Data["Series"][$Serie]["Data"]); } }
- }
- /* Return the sum of the serie values */
- function getSum($Serie)
- { if (isset($this->Data["Series"][$Serie])) { return(array_sum($this->Data["Series"][$Serie]["Data"])); } else { return(NULL); } }
- /* Return the max value of a given serie */
- function getMax($Serie)
- { if (isset($this->Data["Series"][$Serie]["Max"])) { return($this->Data["Series"][$Serie]["Max"]); } else { return(NULL); } }
- /* Return the min value of a given serie */
- function getMin($Serie)
- { if (isset($this->Data["Series"][$Serie]["Min"])) { return($this->Data["Series"][$Serie]["Min"]); } else { return(NULL); } }
- /* Set the description of a given serie */
- function setSerieShape($Series,$Shape=SERIE_SHAPE_FILLEDCIRCLE)
- {
- if ( !is_array($Series) ) { $Series = $this->convertToArray($Series); }
- foreach($Series as $Key => $Serie) { if (isset($this->Data["Series"][$Serie]) ) { $this->Data["Series"][$Serie]["Shape"] = $Shape; } }
- }
- /* Set the description of a given serie */
- function setSerieDescription($Series,$Description="My serie")
- {
- if ( !is_array($Series) ) { $Series = $this->convertToArray($Series); }
- foreach($Series as $Key => $Serie) { if (isset($this->Data["Series"][$Serie]) ) { $this->Data["Series"][$Serie]["Description"] = $Description; } }
- }
- /* Set a serie as "drawable" while calling a rendering function */
- function setSerieDrawable($Series,$Drawable=TRUE)
- {
- if ( !is_array($Series) ) { $Series = $this->convertToArray($Series); }
- foreach($Series as $Key => $Serie) { if (isset($this->Data["Series"][$Serie]) ) { $this->Data["Series"][$Serie]["isDrawable"] = $Drawable; } }
- }
- /* Set the icon associated to a given serie */
- function setSeriePicture($Series,$Picture=NULL)
- {
- if ( !is_array($Series) ) { $Series = $this->convertToArray($Series); }
- foreach($Series as $Key => $Serie) { if (isset($this->Data["Series"][$Serie]) ) { $this->Data["Series"][$Serie]["Picture"] = $Picture; } }
- }
- /* Set the name of the X Axis */
- function setXAxisName($Name)
- { $this->Data["XAxisName"] = $Name; }
- /* Set the display mode of the X Axis */
- function setXAxisDisplay($Mode,$Format=NULL)
- { $this->Data["XAxisDisplay"] = $Mode; $this->Data["XAxisFormat"] = $Format; }
- /* Set the unit that will be displayed on the X axis */
- function setXAxisUnit($Unit)
- { $this->Data["XAxisUnit"] = $Unit; }
- /* Set the serie that will be used as abscissa */
- function setAbscissa($Serie)
- { if (isset($this->Data["Series"][$Serie])) { $this->Data["Abscissa"] = $Serie; } }
- function setAbsicssaPosition($Position = AXIS_POSITION_BOTTOM)
- { $this->Data["AbsicssaPosition"] = $Position; }
- /* Set the name of the abscissa axis */
- function setAbscissaName($Name)
- { $this->Data["AbscissaName"] = $Name; }
- /* Create a scatter group specifyin X and Y data series */
- function setScatterSerie($SerieX,$SerieY,$ID=0)
- { if (isset($this->Data["Series"][$SerieX]) && isset($this->Data["Series"][$SerieY]) ) { $this->initScatterSerie($ID); $this->Data["ScatterSeries"][$ID]["X"] = $SerieX; $this->Data["ScatterSeries"][$ID]["Y"] = $SerieY; } }
- /* Set the shape of a given sctatter serie */
- function setScatterSerieShape($ID,$Shape=SERIE_SHAPE_FILLEDCIRCLE)
- { if (isset($this->Data["ScatterSeries"][$ID]) ) { $this->Data["ScatterSeries"][$ID]["Shape"] = $Shape; } }
- /* Set the description of a given scatter serie */
- function setScatterSerieDescription($ID,$Description="My serie")
- { if (isset($this->Data["ScatterSeries"][$ID]) ) { $this->Data["ScatterSeries"][$ID]["Description"] = $Description; } }
- /* Set the icon associated to a given scatter serie */
- function setScatterSeriePicture($ID,$Picture=NULL)
- { if (isset($this->Data["ScatterSeries"][$ID]) ) { $this->Data["ScatterSeries"][$ID]["Picture"] = $Picture; } }
- /* Set a scatter serie as "drawable" while calling a rendering function */
- function setScatterSerieDrawable($ID ,$Drawable=TRUE)
- { if (isset($this->Data["ScatterSeries"][$ID]) ) { $this->Data["ScatterSeries"][$ID]["isDrawable"] = $Drawable; } }
- /* Define if a scatter serie should be draw with ticks */
- function setScatterSerieTicks($ID,$Width=0)
- { if ( isset($this->Data["ScatterSeries"][$ID]) ) { $this->Data["ScatterSeries"][$ID]["Ticks"] = $Width; } }
- /* Define if a scatter serie should be draw with a special weight */
- function setScatterSerieWeight($ID,$Weight=0)
- { if ( isset($this->Data["ScatterSeries"][$ID]) ) { $this->Data["ScatterSeries"][$ID]["Weight"] = $Weight; } }
- /* Associate a color to a scatter serie */
- function setScatterSerieColor($ID,$Format)
- {
- $R = isset($Format["R"]) ? $Format["R"] : 0;
- $G = isset($Format["G"]) ? $Format["G"] : 0;
- $B = isset($Format["B"]) ? $Format["B"] : 0;
- $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100;
- if ( isset($this->Data["ScatterSeries"][$ID]) )
- {
- $this->Data["ScatterSeries"][$ID]["Color"]["R"] = $R;
- $this->Data["ScatterSeries"][$ID]["Color"]["G"] = $G;
- $this->Data["ScatterSeries"][$ID]["Color"]["B"] = $B;
- $this->Data["ScatterSeries"][$ID]["Color"]["Alpha"] = $Alpha;
- }
- }
- /* Compute the series limits for an individual and global point of view */
- function limits()
- {
- $GlobalMin = ABSOLUTE_MAX;
- $GlobalMax = ABSOLUTE_MIN;
- foreach($this->Data["Series"] as $Key => $Value)
- {
- if ( $this->Data["Abscissa"] != $Key && $this->Data["Series"][$Key]["isDrawable"] == TRUE)
- {
- if ( $GlobalMin > $this->Data["Series"][$Key]["Min"] ) { $GlobalMin = $this->Data["Series"][$Key]["Min"]; }
- if ( $GlobalMax < $this->Data["Series"][$Key]["Max"] ) { $GlobalMax = $this->Data["Series"][$Key]["Max"]; }
- }
- }
- $this->Data["Min"] = $GlobalMin;
- $this->Data["Max"] = $GlobalMax;
- return(array($GlobalMin,$GlobalMax));
- }
- /* Mark all series as drawable */
- function drawAll()
- { foreach($this->Data["Series"] as $Key => $Value) { if ( $this->Data["Abscissa"] != $Key ) { $this->Data["Series"][$Key]["isDrawable"]=TRUE; } } }
- /* Return the average value of the given serie */
- function getSerieAverage($Serie)
- {
- if ( isset($this->Data["Series"][$Serie]) )
- {
- $SerieData = $this->stripVOID($this->Data["Series"][$Serie]["Data"]);
- return(array_sum($SerieData)/sizeof($SerieData));
- }
- else
- return(NULL);
- }
- /* Return the geometric mean of the given serie */
- function getGeometricMean($Serie)
- {
- if ( isset($this->Data["Series"][$Serie]) )
- {
- $SerieData = $this->stripVOID($this->Data["Series"][$Serie]["Data"]);
- $Seriesum = 1; foreach($SerieData as $Key => $Value) { $Seriesum = $Seriesum * $Value; }
- return(pow($Seriesum,1/sizeof($SerieData)));
- }
- else
- return(NULL);
- }
- /* Return the harmonic mean of the given serie */
- function getHarmonicMean($Serie)
- {
- if ( isset($this->Data["Series"][$Serie]) )
- {
- $SerieData = $this->stripVOID($this->Data["Series"][$Serie]["Data"]);
- $Seriesum = 0; foreach($SerieData as $Key => $Value) { $Seriesum = $Seriesum + 1/$Value; }
- return(sizeof($SerieData)/$Seriesum);
- }
- else
- return(NULL);
- }
- /* Return the standard deviation of the given serie */
- function getStandardDeviation($Serie)
- {
- if ( isset($this->Data["Series"][$Serie]) )
- {
- $Average = $this->getSerieAverage($Serie);
- $SerieData = $this->stripVOID($this->Data["Series"][$Serie]["Data"]);
- $DeviationSum = 0;
- foreach($SerieData as $Key => $Value)
- $DeviationSum = $DeviationSum + ($Value-$Average)*($Value-$Average);
- $Deviation = sqrt($DeviationSum/count($SerieData));
- return($Deviation);
- }
- else
- return(NULL);
- }
- /* Return the Coefficient of variation of the given serie */
- function getCoefficientOfVariation($Serie)
- {
- if ( isset($this->Data["Series"][$Serie]) )
- {
- $Average = $this->getSerieAverage($Serie);
- $StandardDeviation = $this->getStandardDeviation($Serie);
- if ( $StandardDeviation != 0 )
- return($StandardDeviation/$Average);
- else
- return(NULL);
- }
- else
- return(NULL);
- }
- /* Return the median value of the given serie */
- function getSerieMedian($Serie)
- {
- if ( isset($this->Data["Series"][$Serie]) )
- {
- $SerieData = $this->stripVOID($this->Data["Series"][$Serie]["Data"]);
- sort($SerieData);
- $SerieCenter = floor(sizeof($SerieData)/2);
- if ( isset($SerieData[$SerieCenter]) )
- return($SerieData[$SerieCenter]);
- else
- return(NULL);
- }
- else
- return(NULL);
- }
- /* Return the x th percentil of the given serie */
- function getSeriePercentile($Serie="Serie1",$Percentil=95)
- {
- if (!isset($this->Data["Series"][$Serie]["Data"])) { return(NULL); }
- $Values = count($this->Data["Series"][$Serie]["Data"])-1;
- if ( $Values < 0 ) { $Values = 0; }
- $PercentilID = floor(($Values/100)*$Percentil+.5);
- $SortedValues = $this->Data["Series"][$Serie]["Data"];
- sort($SortedValues);
- if ( is_numeric($SortedValues[$PercentilID]) )
- return($SortedValues[$PercentilID]);
- else
- return(NULL);
- }
- /* Add random values to a given serie */
- function addRandomValues($SerieName="Serie1",$Options="")
- {
- $Values = isset($Options["Values"]) ? $Options["Values"] : 20;
- $Min = isset($Options["Min"]) ? $Options["Min"] : 0;
- $Max = isset($Options["Max"]) ? $Options["Max"] : 100;
- $withFloat = isset($Options["withFloat"]) ? $Options["withFloat"] : FALSE;
- for ($i=0;$i<=$Values;$i++)
- {
- if ( $withFloat ) { $Value = rand($Min*100,$Max*100)/100; } else { $Value = rand($Min,$Max); }
- $this->addPoints($Value,$SerieName);
- }
- }
- /* Test if we have valid data */
- function containsData()
- {
- if (!isset($this->Data["Series"])) { return(FALSE); }
- $Result = FALSE;
- foreach($this->Data["Series"] as $Key => $Value)
- { if ( $this->Data["Abscissa"] != $Key && $this->Data["Series"][$Key]["isDrawable"]==TRUE) { $Result=TRUE; } }
- return($Result);
- }
- /* Set the display mode of an Axis */
- function setAxisDisplay($AxisID,$Mode=AXIS_FORMAT_DEFAULT,$Format=NULL)
- {
- if ( isset($this->Data["Axis"][$AxisID] ) )
- {
- $this->Data["Axis"][$AxisID]["Display"] = $Mode;
- if ( $Format != NULL ) { $this->Data["Axis"][$AxisID]["Format"] = $Format; }
- }
- }
- /* Set the position of an Axis */
- function setAxisPosition($AxisID,$Position=AXIS_POSITION_LEFT)
- { if ( isset($this->Data["Axis"][$AxisID] ) ) { $this->Data["Axis"][$AxisID]["Position"] = $Position; } }
- /* Associate an unit to an axis */
- function setAxisUnit($AxisID,$Unit)
- { if ( isset($this->Data["Axis"][$AxisID] ) ) { $this->Data["Axis"][$AxisID]["Unit"] = $Unit; } }
- /* Associate a name to an axis */
- function setAxisName($AxisID,$Name)
- { if ( isset($this->Data["Axis"][$AxisID] ) ) { $this->Data["Axis"][$AxisID]["Name"] = $Name; } }
- /* Associate a color to an axis */
- function setAxisColor($AxisID,$Format)
- {
- $R = isset($Format["R"]) ? $Format["R"] : 0;
- $G = isset($Format["G"]) ? $Format["G"] : 0;
- $B = isset($Format["B"]) ? $Format["B"] : 0;
- $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100;
- if ( isset($this->Data["Axis"][$AxisID] ) )
- {
- $this->Data["Axis"][$AxisID]["Color"]["R"] = $R;
- $this->Data["Axis"][$AxisID]["Color"]["G"] = $G;
- $this->Data["Axis"][$AxisID]["Color"]["B"] = $B;
- $this->Data["Axis"][$AxisID]["Color"]["Alpha"] = $Alpha;
- }
- }
- /* Design an axis as X or Y member */
- function setAxisXY($AxisID,$Identity=AXIS_Y)
- { if ( isset($this->Data["Axis"][$AxisID] ) ) { $this->Data["Axis"][$AxisID]["Identity"] = $Identity; } }
- /* Associate one data serie with one axis */
- function setSerieOnAxis($Series,$AxisID)
- {
- if ( !is_array($Series) ) { $Series = $this->convertToArray($Series); }
- foreach($Series as $Key => $Serie)
- {
- $PreviousAxis = $this->Data["Series"][$Serie]["Axis"];
- /* Create missing axis */
- if ( !isset($this->Data["Axis"][$AxisID] ) )
- { $this->Data["Axis"][$AxisID]["Position"] = AXIS_POSITION_LEFT; $this->Data["Axis"][$AxisID]["Identity"] = AXIS_Y;}
- $this->Data["Series"][$Serie]["Axis"] = $AxisID;
- /* Cleanup unused axis */
- $Found = FALSE;
- foreach($this->Data["Series"] as $SerieName => $Values) { if ( $Values["Axis"] == $PreviousAxis ) { $Found = TRUE; } }
- if (!$Found) { unset($this->Data["Axis"][$PreviousAxis]); }
- }
- }
- /* Define if a serie should be draw with ticks */
- function setSerieTicks($Series,$Width=0)
- {
- if ( !is_array($Series) ) { $Series = $this->convertToArray($Series); }
- foreach($Series as $Key => $Serie) { if ( isset($this->Data["Series"][$Serie]) ) { $this->Data["Series"][$Serie]["Ticks"] = $Width; } }
- }
- /* Define if a serie should be draw with a special weight */
- function setSerieWeight($Series,$Weight=0)
- {
- if ( !is_array($Series) ) { $Series = $this->convertToArray($Series); }
- foreach($Series as $Key => $Serie) { if ( isset($this->Data["Series"][$Serie]) ) { $this->Data["Series"][$Serie]["Weight"] = $Weight; } }
- }
- /* Returns the palette of the given serie */
- function getSeriePalette($Serie)
- {
- if ( !isset($this->Data["Series"][$Serie]) ) { return(NULL); }
- $Result = "";
- $Result["R"] = $this->Data["Series"][$Serie]["Color"]["R"];
- $Result["G"] = $this->Data["Series"][$Serie]["Color"]["G"];
- $Result["B"] = $this->Data["Series"][$Serie]["Color"]["B"];
- $Result["Alpha"] = $this->Data["Series"][$Serie]["Color"]["Alpha"];
- return($Result);
- }
- /* Set the color of one serie */
- function setPalette($Series,$Format=NULL)
- {
- if ( !is_array($Series) ) { $Series = $this->convertToArray($Series); }
- foreach($Series as $Key => $Serie)
- {
- $R = isset($Format["R"]) ? $Format["R"] : 0;
- $G = isset($Format["G"]) ? $Format["G"] : 0;
- $B = isset($Format["B"]) ? $Format["B"] : 0;
- $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100;
- if ( isset($this->Data["Series"][$Serie]) )
- {
- $OldR = $this->Data["Series"][$Serie]["Color"]["R"]; $OldG = $this->Data["Series"][$Serie]["Color"]["G"]; $OldB = $this->Data["Series"][$Serie]["Color"]["B"];
- $this->Data["Series"][$Serie]["Color"]["R"] = $R;
- $this->Data["Series"][$Serie]["Color"]["G"] = $G;
- $this->Data["Series"][$Serie]["Color"]["B"] = $B;
- $this->Data["Series"][$Serie]["Color"]["Alpha"] = $Alpha;
- /* Do reverse processing on the internal palette array */
- foreach ($this->Palette as $Key => $Value)
- { if ($Value["R"] == $OldR && $Value["G"] == $OldG && $Value["B"] == $OldB) { $this->Palette[$Key]["R"] = $R; $this->Palette[$Key]["G"] = $G; $this->Palette[$Key]["B"] = $B; $this->Palette[$Key]["Alpha"] = $Alpha;} }
- }
- }
- }
- /* Load a palette file */
- function loadPalette($FileName,$Overwrite=FALSE)
- {
- if ( !file_exists($FileName) ) { return(-1); }
- if ( $Overwrite ) { $this->Palette = ""; }
- $fileHandle = @fopen($FileName, "r");
- if (!$fileHandle) { return(-1); }
- while (!feof($fileHandle))
- {
- $buffer = fgets($fileHandle, 4096);
- if ( preg_match("/,/",$buffer) )
- {
- list($R,$G,$B,$Alpha) = preg_split("/,/",$buffer);
- if ( $this->Palette == "" ) { $ID = 0; } else { $ID = count($this->Palette); }
- $this->Palette[$ID] = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha);
- }
- }
- fclose($fileHandle);
- /* Apply changes to current series */
- $ID = 0;
- if ( isset($this->Data["Series"]))
- {
- foreach($this->Data["Series"] as $Key => $Value)
- {
- if ( !isset($this->Palette[$ID]) )
- $this->Data["Series"][$Key]["Color"] = array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>0);
- else
- $this->Data["Series"][$Key]["Color"] = $this->Palette[$ID];
- $ID++;
- }
- }
- }
- /* Initialise a given scatter serie */
- function initScatterSerie($ID)
- {
- if ( isset($this->Data["ScatterSeries"][$ID]) ) { return(0); }
- $this->Data["ScatterSeries"][$ID]["Description"] = "Scatter ".$ID;
- $this->Data["ScatterSeries"][$ID]["isDrawable"] = TRUE;
- $this->Data["ScatterSeries"][$ID]["Picture"] = NULL;
- $this->Data["ScatterSeries"][$ID]["Ticks"] = 0;
- $this->Data["ScatterSeries"][$ID]["Weight"] = 0;
- if ( isset($this->Palette[$ID]) )
- $this->Data["ScatterSeries"][$ID]["Color"] = $this->Palette[$ID];
- else
- {
- $this->Data["ScatterSeries"][$ID]["Color"]["R"] = rand(0,255);
- $this->Data["ScatterSeries"][$ID]["Color"]["G"] = rand(0,255);
- $this->Data["ScatterSeries"][$ID]["Color"]["B"] = rand(0,255);
- $this->Data["ScatterSeries"][$ID]["Color"]["Alpha"] = 100;
- }
- }
- /* Initialise a given serie */
- function initialise($Serie)
- {
- if ( isset($this->Data["Series"]) ) { $ID = count($this->Data["Series"]); } else { $ID = 0; }
- $this->Data["Series"][$Serie]["Description"] = $Serie;
- $this->Data["Series"][$Serie]["isDrawable"] = TRUE;
- $this->Data["Series"][$Serie]["Picture"] = NULL;
- $this->Data["Series"][$Serie]["Max"] = NULL;
- $this->Data["Series"][$Serie]["Min"] = NULL;
- $this->Data["Series"][$Serie]["Axis"] = 0;
- $this->Data["Series"][$Serie]["Ticks"] = 0;
- $this->Data["Series"][$Serie]["Weight"] = 0;
- $this->Data["Series"][$Serie]["Shape"] = SERIE_SHAPE_FILLEDCIRCLE;
- if ( isset($this->Palette[$ID]) )
- $this->Data["Series"][$Serie]["Color"] = $this->Palette[$ID];
- else
- {
- $this->Data["Series"][$Serie]["Color"]["R"] = rand(0,255);
- $this->Data["Series"][$Serie]["Color"]["G"] = rand(0,255);
- $this->Data["Series"][$Serie]["Color"]["B"] = rand(0,255);
- $this->Data["Series"][$Serie]["Color"]["Alpha"] = 100;
- }
- }
-
- function normalize($NormalizationFactor=100,$UnitChange=NULL,$Round=1)
- {
- $Abscissa = $this->Data["Abscissa"];
- $SelectedSeries = "";
- $MaxVal = 0;
- foreach($this->Data["Axis"] as $AxisID => $Axis)
- {
- if ( $UnitChange != NULL ) { $this->Data["Axis"][$AxisID]["Unit"] = $UnitChange; }
- foreach($this->Data["Series"] as $SerieName => $Serie)
- {
- if ($Serie["Axis"] == $AxisID && $Serie["isDrawable"] == TRUE && $SerieName != $Abscissa)
- {
- $SelectedSeries[$SerieName] = $SerieName;
- if ( count($Serie["Data"] ) > $MaxVal ) { $MaxVal = count($Serie["Data"]); }
- }
- }
- }
- for($i=0;$i<=$MaxVal-1;$i++)
- {
- $Factor = 0;
- foreach ($SelectedSeries as $Key => $SerieName )
- {
- $Value = $this->Data["Series"][$SerieName]["Data"][$i];
- if ( $Value != VOID )
- $Factor = $Factor + abs($Value);
- }
- if ( $Factor != 0 )
- {
- $Factor = $NormalizationFactor / $Factor;
- foreach ($SelectedSeries as $Key => $SerieName )
- {
- $Value = $this->Data["Series"][$SerieName]["Data"][$i];
- if ( $Value != VOID && $Factor != $NormalizationFactor )
- $this->Data["Series"][$SerieName]["Data"][$i] = round(abs($Value)*$Factor,$Round);
- elseif ( $Value == VOID || $Value == 0 )
- $this->Data["Series"][$SerieName]["Data"][$i] = VOID;
- elseif ( $Factor == $NormalizationFactor )
- $this->Data["Series"][$SerieName]["Data"][$i] = $NormalizationFactor;
- }
- }
- }
- foreach ($SelectedSeries as $Key => $SerieName )
- {
- $this->Data["Series"][$SerieName]["Max"] = max($this->stripVOID($this->Data["Series"][$SerieName]["Data"]));
- $this->Data["Series"][$SerieName]["Min"] = min($this->stripVOID($this->Data["Series"][$SerieName]["Data"]));
- }
- }
- /* Load data from a CSV (or similar) data source */
- function importFromCSV($FileName,$Options="")
- {
- $Delimiter = isset($Options["Delimiter"]) ? $Options["Delimiter"] : ",";
- $GotHeader = isset($Options["GotHeader"]) ? $Options["GotHeader"] : FALSE;
- $SkipColumns = isset($Options["SkipColumns"]) ? $Options["SkipColumns"] : array(-1);
- $DefaultSerieName = isset($Options["DefaultSerieName"]) ? $Options["DefaultSerieName"] : "Serie";
- $Handle = @fopen($FileName,"r");
- if ($Handle)
- {
- $HeaderParsed = FALSE; $SerieNames = "";
- while (!feof($Handle))
- {
- $Buffer = fgets($Handle, 4096);
- $Buffer = str_replace(chr(10),"",$Buffer);
- $Buffer = str_replace(chr(13),"",$Buffer);
- $Values = preg_split("/".$Delimiter."/",$Buffer);
- if ( $Buffer != "" )
- {
- if ( $GotHeader && !$HeaderParsed )
- {
- foreach($Values as $Key => $Name) { if ( !in_array($Key,$SkipColumns) ) { $SerieNames[$Key] = $Name; } }
- $HeaderParsed = TRUE;
- }
- else
- {
- if ($SerieNames == "" ) { foreach($Values as $Key => $Name) { if ( !in_array($Key,$SkipColumns) ) { $SerieNames[$Key] = $DefaultSerieName.$Key; } } }
- foreach($Values as $Key => $Value) { if ( !in_array($Key,$SkipColumns) ) { $this->addPoints($Value,$SerieNames[$Key]); } }
- }
- }
- }
- fclose($Handle);
- }
- }
- /* Create a dataset based on a formula */
- function createFunctionSerie($SerieName,$Formula="",$Options="")
- {
- $MinX = isset($Options["MinX"]) ? $Options["MinX"] : -10;
- $MaxX = isset($Options["MaxX"]) ? $Options["MaxX"] : 10;
- $XStep = isset($Options["XStep"]) ? $Options["XStep"] : 1;
- $AutoDescription = isset($Options["AutoDescription"]) ? $Options["AutoDescription"] : FALSE;
- $RecordAbscissa = isset($Options["RecordAbscissa"]) ? $Options["RecordAbscissa"] : FALSE;
- $AbscissaSerie = isset($Options["AbscissaSerie"]) ? $Options["AbscissaSerie"] : "Abscissa";
- if ( $Formula == "" ) { return(0); }
- $Result = ""; $Abscissa = "";
- for($i=$MinX; $i<=$MaxX; $i=$i+$XStep)
- {
- $Expression = "\$return = '!'.(".str_replace("z",$i,$Formula).");";
- if ( @eval($Expression) === FALSE ) { $return = VOID; }
- if ( $return == "!" ) { $return = VOID; } else { $return = $this->right($return,strlen($return)-1); }
- if ( $return == "NAN" ) { $return = VOID; }
- if ( $return == "INF" ) { $return = VOID; }
- if ( $return == "-INF" ) { $return = VOID; }
- $Abscissa[] = $i;
- $Result[] = $return;
- }
- $this->addPoints($Result,$SerieName);
- if ( $AutoDescription ) { $this->setSerieDescription($SerieName,$Formula); }
- if ( $RecordAbscissa ) { $this->addPoints($Abscissa,$AbscissaSerie); }
- }
- function negateValues($Series)
- {
- if ( !is_array($Series) ) { $Series = $this->convertToArray($Series); }
- foreach($Series as $Key => $SerieName)
- {
- if (isset($this->Data["Series"][$SerieName]))
- {
- $Data = "";
- foreach($this->Data["Series"][$SerieName]["Data"] as $Key => $Value)
- { if ( $Value == VOID ) { $Data[] = VOID; } else { $Data[] = -$Value; } }
- $this->Data["Series"][$SerieName]["Data"] = $Data;
- $this->Data["Series"][$SerieName]["Max"] = max($this->stripVOID($this->Data["Series"][$SerieName]["Data"]));
- $this->Data["Series"][$SerieName]["Min"] = min($this->stripVOID($this->Data["Series"][$SerieName]["Data"]));
- }
- }
- }
- /* Return the data & configuration of the series */
- function getData()
- { return($this->Data); }
- /* Save a palette element */
- function savePalette($ID,$Color)
- { $this->Palette[$ID] = $Color; }
- /* Return the palette of the series */
- function getPalette()
- { return($this->Palette); }
- /* Called by the scaling algorithm to save the config */
- function saveAxisConfig($Axis) { $this->Data["Axis"]=$Axis; }
- /* Save the Y Margin if set */
- function saveYMargin($Value) { $this->Data["YMargin"]=$Value; }
- /* Save extended configuration to the pData object */
- function saveExtendedData($Tag,$Values) { $this->Data["Extended"][$Tag]=$Values; }
- /* Called by the scaling algorithm to save the orientation of the scale */
- function saveOrientation($Orientation) { $this->Data["Orientation"]=$Orientation; }
- /* Convert a string to a single elements array */
- function convertToArray($Value)
- { $Values = ""; $Values[] = $Value; return($Values); }
- /* Class string wrapper */
- function __toString()
- { return("pData object."); }
- function left($value,$NbChar) { return substr($value,0,$NbChar); }
- function right($value,$NbChar) { return substr($value,strlen($value)-$NbChar,$NbChar); }
- function mid($value,$Depart,$NbChar) { return substr($value,$Depart-1,$NbChar); }
- }
- ?>
|