show=$f; } function SetColor($color) { $this->color = $color; } function SetFont($ff,$fs=FS_NORMAL,$fsize=10) { $this->ff=$ff; $this->fs=$fs; $this->fsize=$fsize; } function SetMargin($m) { $this->margin = $m; } function SetFormat($format,$angle=0) { $this->format= $format; $this->angle = $angle; } } //=================================================== // CLASS LinePlot // Description: //=================================================== class LinePlot extends Plot{ var $filled=false; var $fill_color; var $mark=null; var $step_style=false, $center=false; var $line_style=1; // Default to solid var $value; //--------------- // CONSTRUCTOR function LinePlot(&$datay,$datax=false) { $this->Plot($datay,$datax); $this->mark = new PlotMark(); $this->mark->SetColor($this->color); $this->value = new DisplayValue(); } //--------------- // PUBLIC METHODS // Set style, filled or open function SetFilled($f=true) { $this->filled=$f; } function SetStyle($s) { $this->line_style=$s; } function SetStepStyle($f=true) { $this->step_style = $f; } function SetColor($c) { parent::SetColor($c); $this->mark->SetColor($this->color); } function SetFillColor($c,$f=true) { $this->fill_color=$c; $this->filled=$f; } function Legend(&$graph) { if( $this->legend!="" ) { if( $this->filled ) { $graph->legend->Add($this->legend, $this->fill_color,$this->mark); } else { $graph->legend->Add($this->legend, $this->color,$this->mark,$this->line_style); } } } function SetCenter($c=true) { $this->center=$c; } // Gets called before any axis are stroked function PreStrokeAdjust(&$graph) { if( $this->center ) { ++$this->numpoints; $a=0.5; $b=0.5; } else { $a=0; $b=0; } $graph->xaxis->scale->ticks->SetXLabelOffset($a); $graph->SetTextScaleOff($b); $graph->xaxis->scale->ticks->SupressMinorTickMarks(); } function Stroke(&$img,&$xscale,&$yscale) { $numpoints=count($this->coords[0]); if( isset($this->coords[1]) ) { if( count($this->coords[1])!=$numpoints ) JpGraphError::Raise("JpGraph Error: 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; $img->SetStartPoint($xscale->Translate($xs), $yscale->Translate($this->coords[0][0])); if( $this->filled ) { $cord[] = $xscale->Translate($xs); $cord[] = $yscale->Translate($yscale->GetMinVal()); } $cord[] = $xscale->Translate($xs); $cord[] = $yscale->Translate($this->coords[0][0]); $yt_old = $yscale->Translate($this->coords[0][0]); $img->SetColor($this->color); $img->SetLineWeight($this->weight); $img->SetLineStyle($this->line_style); for( $pnts=1; $pnts<$numpoints; ++$pnts) { if( $exist_x ) $x=$this->coords[1][$pnts]; else $x=$pnts; $xt = $xscale->Translate($x); $yt = $yscale->Translate($this->coords[0][$pnts]); $cord[] = $xt; $cord[] = $yt; if( $this->step_style ) { $img->StyleLineTo($xt,$yt_old); $img->StyleLineTo($xt,$yt); } else { $y=$this->coords[0][$pnts]; if( is_numeric($y) || (is_string($y) && $y != "-") ) { $tmp1=$this->coords[0][$pnts]; $tmp2=$this->coords[0][$pnts-1]; if( is_numeric($tmp1) && (is_numeric($tmp2) || $tmp2=="-" ) ) { $img->StyleLineTo($xt,$yt); } else { $img->SetStartPoint($xt,$yt); } } } $yt_old = $yt; if( $this->value->show) { $sval=sprintf($this->value->format,$this->coords[0][$pnts]); $txt = new Text($sval,$xt,$yt-$this->value->margin); $txt->SetFont($this->value->ff,$this->value->fs,$this->value->fsize); $txt->Align("center","bottom"); $txt->SetOrientation($this->value->angle); $txt->SetColor($this->value->color); $txt->Stroke($img); } } if( $this->filled ) { $cord[] = $xt; $cord[] = $yscale->Translate($yscale->GetMinVal()); $img->SetColor($this->fill_color); $img->FilledPolygon($cord); $img->SetColor($this->color); $img->Polygon($cord); } $adjust=0; if( $this->filled ) $adjust=2; for($i=$adjust; $icoords[0][($i-$adjust)/2]) ) $this->mark->Stroke($img,$cord[$i],$cord[$i+1]); } } //--------------- // PRIVATE METHODS } // Class //=================================================== // CLASS AccLinePlot // Description: //=================================================== class AccLinePlot extends Plot { var $plots=null,$nbrplots=0,$numpoints=0; //--------------- // CONSTRUCTOR function AccLinePlot($plots) { $this->plots = $plots; $this->nbrplots = count($plots); $this->numpoints = $plots[0]->numpoints; } //--------------- // PUBLIC METHODS function Legend(&$graph) { foreach( $this->plots as $p ) $p->Legend($graph); } function Max() { $accymax=0; list($xmax,$dummy) = $this->plots[0]->Max(); foreach($this->plots as $p) { list($xm,$ym) = $p->Max(); $xmax = max($xmax,$xm); $accymax += $ym; } return array($xmax,$accymax); } function Min() { list($xmin,$ymin)=$this->plots[0]->Min(); foreach( $this->plots as $p ) { list($xm,$ym)=$p->Min(); $xmin=Min($xmin,$xm); $ymin=Min($ymin,$ym); } return array($xmin,$ymin); } // To avoid duplicate of line drawing code here we just // change the y-values for each plot and then restore it // after we have made the stroke. We must do this copy since // it wouldn't be possible to create an acc line plot // with the same graphs, i.e AccLinePlot(array($pl,$pl,$pl)); // since this method would have a side effect. function Stroke(&$img,&$xscale,&$yscale) { $img->SetLineWeight($this->weight); // Allocate array $coords[$this->nbrplots][$this->numpoints]=0; for($i=0; $i<$this->numpoints; $i++) { $coords[0][$i]=$this->plots[0]->coords[0][$i]; $accy=$coords[0][$i]; for($j=1; $j<$this->nbrplots; ++$j ) { $coords[$j][$i] = $this->plots[$j]->coords[0][$i]+$accy; $accy = $coords[$j][$i]; } } for($j=$this->nbrplots-1; $j>=0; --$j) { $p=$this->plots[$j]; for( $i=0; $i<$this->numpoints; ++$i) { $tmp[$i]=$p->coords[0][$i]; $p->coords[0][$i]=$coords[$j][$i]; } $p->Stroke($img,$xscale,$yscale); for( $i=0; $i<$this->numpoints; ++$i) $p->coords[0][$i]=$tmp[$i]; $p->coords[0][]=$tmp; } } } // Class /* EOF */ ?>