Blame | Last modification | View Log | RSS feed
<?php/*=======================================================================// File: JPGRAPH_STOCK.PHP// Description: Stock plot extension for JpGraph// Created: 2003-01-27// Author: Johan Persson (johanp@aditus.nu)// Ver: $Id: jpgraph_stock.php,v 1.1 2004/06/15 10:13:19 jpm Exp $//// License: This code is released under QPL// Copyright (C) 2003 Johan Persson//========================================================================*///===================================================// CLASS StockPlot//===================================================class StockPlot extends Plot {var $iWidth=9;var $iEndLines=1;var $iStockColor1='white',$iStockColor2='darkred',$iStockColor3='darkred';var $iTupleSize = 4;//---------------// CONSTRUCTORfunction StockPlot(&$datay,$datax=false) {if( count($datay) % $this->iTupleSize ) {JpGraphError::Raise('Data values for Stock charts must contain an even multiple of '.$this->iTupleSize.' data points.');}$this->Plot($datay,$datax);$this->numpoints /= $this->iTupleSize;}//---------------// PUBLIC METHODSfunction 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 strokedfunction 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);}// Method descriptionfunction Stroke($img,$xscale,$yscale) {$n=$this->numpoints;if( $this->center ) $n--;if( isset($this->coords[1]) ) {if( count($this->coords[1])!=$n )JpGraphError::Raise("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 allif ($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*4] > $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 mapsif( !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 .= " alt=\"$sval\" title=\"$sval\" ";}$this->csimareas.= ">\n";}}return true;}// A hook for subclasses to modify the plotfunction 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 */?>