| <?php |
| /*======================================================================= |
| // File: JPGRAPH_STOCK.PHP |
| // Description: Stock plot extension for JpGraph |
| // Created: 2003-01-27 |
| // Author: Johan Persson (johanp@aditus.nu) |
| // Ver: $Id$ |
| // |
| // Copyright (c) Aditus Consulting. All rights reserved. |
| //======================================================================== |
| */ |
| |
| //=================================================== |
| // CLASS StockPlot |
| //=================================================== |
| class StockPlot extends Plot { |
| var $iTupleSize = 4; |
| var $iWidth=9; |
| var $iEndLines=1; |
| var $iStockColor1='white',$iStockColor2='darkred',$iStockColor3='darkred'; |
| //--------------- |
| // CONSTRUCTOR |
| function StockPlot(&$datay,$datax=false) { |
| if( count($datay) % $this->iTupleSize ) { |
| JpGraphError::RaiseL(21001,$this->iTupleSize);//('Data values for Stock charts must contain an even multiple of '.$this->iTupleSize.' data points.'); |
| } |
| $this->Plot($datay,$datax); |
| $this->numpoints /= $this->iTupleSize; |
| } |
| //--------------- |
| // PUBLIC METHODS |
| |
| function SetColor($aColor,$aColor1='white',$aColor2='darkred',$aColor3='darkred') { |
| $this->color = $aColor; |
| $this->iStockColor1 = $aColor1; |
| $this->iStockColor2 = $aColor2; |
| $this->iStockColor3 = $aColor3; |
| } |
| |
| function SetWidth($aWidth) { |
| // Make sure it's odd |
| $this->iWidth = 2*floor($aWidth/2)+1; |
| } |
| |
| function HideEndLines($aHide=true) { |
| $this->iEndLines = !$aHide; |
| } |
| |
| // Gets called before any axis are stroked |
| function PreStrokeAdjust(&$graph) { |
| if( $this->center ) { |
| $a=0.5; $b=0.5; |
| $this->numpoints++; |
| } else { |
| $a=0; $b=0; |
| } |
| $graph->xaxis->scale->ticks->SetXLabelOffset($a); |
| $graph->SetTextScaleOff($b); |
| } |
| |
| // Stroke stock plot |
| function Stroke(&$img,$xscale,$yscale) { |
| $n=$this->numpoints; |
| if( $this->center ) $n--; |
| if( isset($this->coords[1]) ) { |
| if( count($this->coords[1])!=$n ) |
| JpGraphError::RaiseL(2003,count($this->coords[1]),$numpoints); |
| //("Number of X and Y points are not equal. Number of X-points:".count($this->coords[1])." Number of Y-points:$numpoints"); |
| else |
| $exist_x = true; |
| } |
| else |
| $exist_x = false; |
| |
| if( $exist_x ) |
| $xs=$this->coords[1][0]; |
| else |
| $xs=0; |
| |
| $ts = $this->iTupleSize; |
| $this->csimareas = ''; |
| for( $i=0; $i<$n; ++$i) { |
| |
| //If value is NULL, then don't draw a bar at all |
| if ($this->coords[0][$i] === null) continue; |
| |
| if( $exist_x ) $x=$this->coords[1][$i]; |
| else $x=$i; |
| $xt = $xscale->Translate($x); |
| |
| $neg = $this->coords[0][$i*$ts] > $this->coords[0][$i*$ts+1] ; |
| $yopen = $yscale->Translate($this->coords[0][$i*$ts]); |
| $yclose = $yscale->Translate($this->coords[0][$i*$ts+1]); |
| $ymin = $yscale->Translate($this->coords[0][$i*$ts+2]); |
| $ymax = $yscale->Translate($this->coords[0][$i*$ts+3]); |
| |
| $dx = floor($this->iWidth/2); |
| $xl = $xt - $dx; |
| $xr = $xt + $dx; |
| |
| if( $neg ) |
| $img->SetColor($this->iStockColor3); |
| else |
| $img->SetColor($this->iStockColor1); |
| $img->FilledRectangle($xl,$yopen,$xr,$yclose); |
| $img->SetLineWeight($this->weight); |
| if( $neg ) |
| $img->SetColor($this->iStockColor2); |
| else |
| $img->SetColor($this->color); |
| |
| $img->Rectangle($xl,$yopen,$xr,$yclose); |
| |
| if( $yopen < $yclose ) { |
| $ytop = $yopen ; |
| $ybottom = $yclose ; |
| } |
| else { |
| $ytop = $yclose ; |
| $ybottom = $yopen ; |
| } |
| $img->SetColor($this->color); |
| $img->Line($xt,$ytop,$xt,$ymax); |
| $img->Line($xt,$ybottom,$xt,$ymin); |
| |
| if( $this->iEndLines ) { |
| $img->Line($xl,$ymax,$xr,$ymax); |
| $img->Line($xl,$ymin,$xr,$ymin); |
| } |
| |
| // A chance for subclasses to add things to the bar |
| // for data point i |
| $this->ModBox($img,$xscale,$yscale,$i,$xl,$xr,$neg); |
| |
| // Setup image maps |
| if( !empty($this->csimtargets[$i]) ) { |
| $this->csimareas.= '<area shape="rect" coords="'. |
| round($xl).','.round($ytop).','. |
| round($xr).','.round($ybottom).'" '; |
| $this->csimareas .= ' href="'.$this->csimtargets[$i].'"'; |
| if( !empty($this->csimalts[$i]) ) { |
| $sval=$this->csimalts[$i]; |
| $this->csimareas .= " title=\"$sval\" "; |
| } |
| $this->csimareas.= " alt=\"$sval\" />\n"; |
| } |
| } |
| return true; |
| } |
| |
| // A hook for subclasses to modify the plot |
| function ModBox($img,$xscale,$yscale,$i,$xl,$xr,$neg) {} |
| |
| } // Class |
| |
| //=================================================== |
| // CLASS BoxPlot |
| //=================================================== |
| class BoxPlot extends StockPlot { |
| var $iPColor='black',$iNColor='white'; |
| function BoxPlot($datay,$datax=false) { |
| $this->iTupleSize=5; |
| parent::StockPlot($datay,$datax); |
| } |
| |
| function SetMedianColor($aPos,$aNeg) { |
| $this->iPColor = $aPos; |
| $this->iNColor = $aNeg; |
| } |
| |
| function ModBox(&$img,$xscale,$yscale,$i,$xl,$xr,$neg) { |
| if( $neg ) |
| $img->SetColor($this->iNColor); |
| else |
| $img->SetColor($this->iPColor); |
| |
| $y = $yscale->Translate($this->coords[0][$i*5+4]); |
| $img->Line($xl,$y,$xr,$y); |
| } |
| } |
| |
| /* EOF */ |
| ?> |