jpgraph_bar.php
上传用户:gzy2002
上传日期:2010-02-11
资源大小:1785k
文件大小:19k
源码类别:

电子政务应用

开发平台:

Java

  1. <?php
  2. /*=======================================================================
  3. // File: JPGRAPH_BAR.PHP
  4. // Description: Bar plot extension for JpGraph
  5. // Created:  2001-01-08
  6. // Author: Johan Persson (johanp@aditus.nu)
  7. // Ver: $Id: jpgraph_bar.php,v 1.6 2003/10/10 03:37:56 wwf Exp $
  8. //
  9. // License: This code is released under QPL
  10. // Copyright (C) 2001,2002 Johan Persson
  11. //========================================================================
  12. */
  13. //===================================================
  14. // CLASS BarPlot
  15. // Description: Main code to produce a bar plot 
  16. //===================================================
  17. class BarPlot extends Plot {
  18.     var $width=0.4; // in percent of major ticks
  19.     var $abswidth=-1; // Width in absolute pixels
  20.     var $fill=false,$fill_color="lightblue"; // Default is to fill with light blue
  21.     var $ybase=0; // Bars start at 0 
  22.     var $align="center";
  23.     var $grad=false,$grad_style=1;
  24.     var $grad_fromcolor=array(50,50,200),$grad_tocolor=array(255,255,255);
  25.     var $bar_shadow=false;
  26.     var $bar_shadow_color="black";
  27.     var $bar_shadow_hsize=3,$bar_shadow_vsize=3;
  28.     var $valuepos='top';
  29. //---------------
  30. // CONSTRUCTOR
  31.     function BarPlot(&$datay,$datax=false) {
  32. $this->Plot($datay,$datax);
  33. ++$this->numpoints;
  34.     }
  35. //---------------
  36. // PUBLIC METHODS
  37.     // Set a drop shadow for the bar (or rather an "up-right" shadow)
  38.     function SetShadow($color="black",$hsize=3,$vsize=3) {
  39. $this->bar_shadow=true;
  40. $this->bar_shadow_color=$color;
  41. $this->bar_shadow_vsize=$vsize;
  42. $this->bar_shadow_hsize=$hsize;
  43. // Adjust the value margin to compensate for shadow
  44. $this->value->margin += $vsize;
  45.     }
  46.     // DEPRECATED use SetYBase instead
  47.     function SetYMin($aYStartValue) {
  48. //die("JpGraph Error: Deprecated function SetYMin. Use SetYBase() instead.");    
  49. $this->ybase=$aYStartValue;
  50.     }
  51.     // Specify the base value for the bars
  52.     function SetYBase($aYStartValue) {
  53. $this->ybase=$aYStartValue;
  54.     }
  55.     function Legend(&$graph) {
  56. if( $this->grad && $this->legend!="" && !$this->fill ) {
  57.     $color=array($this->grad_fromcolor,$this->grad_tocolor,$this->grad_style);
  58.     $graph->legend->Add($this->legend,$color,"",0,
  59. $this->legendcsimtarget,$this->legendcsimalt);
  60. }
  61. elseif( $this->fill_color && $this->legend!="" ) {
  62.     if( is_array($this->fill_color) )
  63. $graph->legend->Add($this->legend,$this->fill_color[0],"",0,
  64.     $this->legendcsimtarget,$this->legendcsimalt);
  65.     else
  66. $graph->legend->Add($this->legend,$this->fill_color,"",0,
  67.     $this->legendcsimtarget,$this->legendcsimalt);
  68. }
  69.     }
  70.     // Gets called before any axis are stroked
  71.     function PreStrokeAdjust(&$graph) {
  72. parent::PreStrokeAdjust($graph);
  73. // If we are using a log Y-scale we want the base to be at the
  74. // minimum Y-value unless the user have specifically set some other
  75. // value than the default.
  76. if( substr($graph->axtype,-3,3)=="log" && $this->ybase==0 )
  77.     $this->ybase = $graph->yaxis->scale->GetMinVal();
  78. // For a "text" X-axis scale we will adjust the
  79. // display of the bars a little bit.
  80. if( substr($graph->axtype,0,3)=="tex" ) {
  81.     // Position the ticks between the bars
  82.     $graph->xaxis->scale->ticks->SetXLabelOffset(0.5,0);
  83.     // Center the bars 
  84.     if( $this->align == "center" )
  85.      $graph->SetTextScaleOff(0.5-$this->width/2);
  86.     elseif( $this->align == "right" )
  87.      $graph->SetTextScaleOff(1-$this->width);
  88. }
  89. else {
  90.     // We only set an absolute width for linear and int scale
  91.     // for text scale the width will be set to a fraction of
  92.     // the majstep width.
  93.     if( $this->abswidth == -1 ) {
  94.                 // Not set
  95. // set width to a visuable sensible default
  96. $this->abswidth = $graph->img->plotwidth/(2*count($this->coords[0]));
  97.     }
  98. }
  99.     }
  100.     function Min() {
  101. $m = parent::Min();
  102. if( $m[1] >= $this->ybase )
  103.     $m[1] = $this->ybase;
  104. return $m;
  105.     }
  106.     function Max() {
  107. $m = parent::Max();
  108. if( $m[1] <= $this->ybase )
  109.     $m[1] = $this->ybase;
  110. return $m;
  111.     }
  112.     // Specify width as fractions of the major stepo size
  113.     function SetWidth($aFractionWidth) {
  114. $this->width=$aFractionWidth;
  115.     }
  116.     // Specify width in absolute pixels. If specified this
  117.     // overrides SetWidth()
  118.     function SetAbsWidth($aWidth) {
  119. $this->abswidth=$aWidth;
  120.     }
  121.     function SetAlign($aAlign) {
  122. $this->align=$aAlign;
  123.     }
  124.     function SetNoFill() {
  125. $this->grad = false;
  126. $this->fill_color=false;
  127. $this->fill=false;
  128.     }
  129.     function SetFillColor($aColor) {
  130. $this->fill = true ;
  131. $this->fill_color=$aColor;
  132.     }
  133.     function SetFillGradient($from_color,$to_color,$style) {
  134. $this->grad=true;
  135. $this->grad_fromcolor=$from_color;
  136. $this->grad_tocolor=$to_color;
  137. $this->grad_style=$style;
  138.     }
  139.     function SetValuePos($aPos) {
  140. $this->valuepos = $aPos;
  141.     }
  142.     function Stroke(&$img,&$xscale,&$yscale) { 
  143. $numpoints = count($this->coords[0]);
  144. if( isset($this->coords[1]) ) {
  145.     if( count($this->coords[1])!=$numpoints )
  146. die("JpGraph Error: Number of X and Y points are not equal.<br>
  147. Number of X-points:".count($this->coords[1])."<br>
  148. Number of Y-points:$numpoints");
  149.     else
  150. $exist_x = true;
  151. }
  152. else 
  153.     $exist_x = false;
  154. $numbars=count($this->coords[0]);
  155. // Use GetMinVal() instead of scale[0] directly since in the case
  156. // of log scale we get a correct value. Log scales will have negative
  157. // values for values < 1 while still not representing negative numbers.
  158. if( $yscale->GetMinVal() >= 0 ) 
  159.     $zp=$yscale->scale_abs[0]; 
  160. else {
  161.     $zp=$yscale->Translate(0);
  162. }
  163. if( $this->abswidth > -1 ) {
  164.     $abswidth=$this->abswidth;
  165. }
  166. else
  167.     $abswidth=round($this->width*$xscale->scale_factor,0);
  168. for($i=0; $i<$numbars; $i++) {
  169.       // If value is NULL, or 0 then don't draw a bar at all
  170.       if ($this->coords[0][$i] === null ||
  171. $this->coords[0][$i] === '' ||
  172. $this->coords[0][$i] === 0 ) continue;    
  173.     if( $exist_x ) $x=$this->coords[1][$i];
  174.     else $x=$i;
  175.     $x=$xscale->Translate($x);
  176.     if( !$xscale->textscale ) {
  177.      if($this->align=="center")
  178.     $x -= $abswidth/2;
  179. elseif($this->align=="right")
  180.     $x -= $abswidth;
  181.     }
  182.     $pts=array(
  183. $x,$zp,
  184. $x,$yscale->Translate($this->coords[0][$i]),
  185. $x+$abswidth,$yscale->Translate($this->coords[0][$i]),
  186. $x+$abswidth,$zp);
  187.     if( $this->grad ) {
  188. $grad = new Gradient($img);
  189. $grad->FilledRectangle($pts[2],$pts[3],
  190.        $pts[6],$pts[7],
  191.        $this->grad_fromcolor,$this->grad_tocolor,$this->grad_style); 
  192.     }
  193.     elseif( !empty($this->fill_color) ) {
  194. if(is_array($this->fill_color)) {
  195.     $img->PushColor($this->fill_color[$i % count($this->fill_color)]);
  196. } else {
  197.     $img->PushColor($this->fill_color);
  198. }
  199. $img->FilledPolygon($pts);
  200. $img->PopColor();
  201.     }
  202.     // Remember value of this bar
  203.     $val=$this->coords[0][$i];
  204.     if( $this->bar_shadow && $val !== 0 && $val !== 0.0 ) {
  205. $ssh = $this->bar_shadow_hsize;
  206. $ssv = $this->bar_shadow_vsize;
  207. // Create points to create a "upper-right" shadow
  208. if( $val > 0 ) {
  209.     $sp[0]=$pts[6]; $sp[1]=$pts[7];
  210.     $sp[2]=$pts[4]; $sp[3]=$pts[5];
  211.     $sp[4]=$pts[2]; $sp[5]=$pts[3];
  212.     $sp[6]=$pts[2]+$ssh; $sp[7]=$pts[3]-$ssv;
  213.     $sp[8]=$pts[4]+$ssh; $sp[9]=$pts[5]-$ssv;
  214.     $sp[10]=$pts[6]+$ssh; $sp[11]=$pts[7]-$ssv;
  215. elseif( $val < 0 ) {
  216.     $sp[0]=$pts[4]; $sp[1]=$pts[5];
  217.     $sp[2]=$pts[6]; $sp[3]=$pts[7];
  218.     $sp[4]=$pts[0]; $sp[5]=$pts[1];
  219.     $sp[6]=$pts[0]+$ssh; $sp[7]=$pts[1]-$ssv;
  220.     $sp[8]=$pts[6]+$ssh; $sp[9]=$pts[7]-$ssv;
  221.     $sp[10]=$pts[4]+$ssh; $sp[11]=$pts[5]-$ssv;
  222. }
  223. $img->PushColor($this->bar_shadow_color);
  224. $img->FilledPolygon($sp);
  225. $img->PopColor();
  226.     }
  227.     // Stroke the outline of the bar
  228.     if( is_array($this->color) )
  229. $img->SetColor($this->color[$i % count($this->color)]);
  230.     else
  231. $img->SetColor($this->color);
  232.     $pts[] = $pts[0];
  233.     $pts[] = $pts[1];
  234.     if( $this->weight > 0 ) {
  235. $img->SetLineWeight($this->weight);
  236. $img->Polygon($pts);
  237.     }
  238.     $x=$pts[2]+($pts[4]-$pts[2])/2;
  239.     if( $this->valuepos=='top' ) {
  240. $y=$pts[3];
  241. $this->value->Stroke($img,$val,$x,$y);
  242.     }
  243.     elseif( $this->valuepos=='max' ) {
  244. $y=$pts[3];
  245. if( $img->a === 90 ) {
  246.     $this->value->SetAlign('right','center');
  247. }
  248. else {
  249.     $this->value->SetAlign('center','top');
  250. }
  251. $this->value->SetMargin(-2);
  252. $this->value->Stroke($img,$val,$x,$y);
  253.     }
  254.     elseif( $this->valuepos=='center' ) {
  255. $y = ($pts[3] + $pts[1])/2;
  256. $this->value->SetAlign('center','center');
  257. $this->value->SetMargin(0);
  258. $this->value->Stroke($img,$val,$x,$y);
  259.     }
  260.     elseif( $this->valuepos=='bottom' || $this->valuepos=='min' ) {
  261. $y=$pts[1];
  262. $this->value->SetMargin(0);
  263. $this->value->Stroke($img,$val,$x,$y);
  264.     }
  265.     else {
  266. JpGraphError::Raise('Unknown position for values on bars :'.$this->valuepos);
  267. die();
  268.     }
  269.     // Create the client side image map
  270.     $rpts = $img->ArrRotate($pts);
  271.     $csimcoord=round($rpts[0]).", ".round($rpts[1]);
  272.     for( $j=1; $j < 4; ++$j){
  273. $csimcoord .= ", ".round($rpts[2*$j]).", ".round($rpts[2*$j+1]);
  274.     }          
  275.     $this->csimareas.= '<area shape="poly" coords="'.$csimcoord.'" ';         
  276.     if( !empty($this->csimtargets[$i]) )
  277. $this->csimareas .= " href="".$this->csimtargets[$i].""";
  278.     if( !empty($this->csimalts[$i]) ) {
  279. $sval=sprintf($this->csimalts[$i],$this->coords[0][$i]);
  280. $this->csimareas .= " alt="$sval" title="$sval" ";
  281.     }
  282.     $this->csimareas .= ">n";
  283. }
  284. return true;
  285.     }
  286. } // Class
  287. //===================================================
  288. // CLASS GroupBarPlot
  289. // Description: Produce grouped bar plots
  290. //===================================================
  291. class GroupBarPlot extends BarPlot {
  292.     var $plots;
  293.     var $width=0.7;
  294.     var $nbrplots=0;
  295.     var $numpoints;
  296. //---------------
  297. // CONSTRUCTOR
  298.     function GroupBarPlot($plots) {
  299. $this->plots = $plots;
  300. $this->nbrplots = count($plots);
  301. $this->numpoints = $plots[0]->numpoints;
  302.     }
  303. //---------------
  304. // PUBLIC METHODS
  305.     function Legend(&$graph) {
  306. $n = count($this->plots);
  307. for($i=0; $i<$n; ++$i)
  308.     $this->plots[$i]->DoLegend($graph);
  309.     }
  310.     function Min() {
  311. list($xmin,$ymin) = $this->plots[0]->Min();
  312. $n = count($this->plots);
  313. for($i=0; $i<$n; ++$i) {
  314.     list($xm,$ym) = $this->plots[$i]->Min();
  315.     $xmin = max($xmin,$xm);
  316.     $ymin = min($ymin,$ym);
  317. }
  318. return array($xmin,$ymin);
  319.     }
  320.     function Max() {
  321. list($xmax,$ymax) = $this->plots[0]->Max();
  322. $n = count($this->plots);
  323. for($i=0; $i<$n; ++$i) {
  324.     list($xm,$ym) = $this->plots[$i]->Max();
  325.     $xmax = max($xmax,$xm);
  326.     $ymax = max($ymax,$ym);
  327. }
  328. return array($xmax,$ymax);
  329.     }
  330.     function GetCSIMareas() {
  331. $n = count($this->plots);
  332. $csimareas='';
  333. for($i=0; $i < $n; ++$i) {
  334.     $csimareas .= $this->plots[$i]->csimareas;
  335. }
  336. return $csimareas;
  337.     }
  338.     // Stroke all the bars next to each other
  339.     function Stroke(&$img,&$xscale,&$yscale) { 
  340. $tmp=$xscale->off;
  341. $n = count($this->plots);
  342. $subwidth = $this->width/$this->nbrplots ; 
  343. for( $i=0; $i < $n; ++$i ) {
  344.     $this->plots[$i]->ymin=$this->ybase;
  345.     $this->plots[$i]->SetWidth($subwidth);
  346.     
  347.     // If the client have used SetTextTickInterval() then
  348.     // major_step will be > 1 and the positioning will fail.
  349.     // If we assume it is always one the positioning will work
  350.     // fine with a text scale but this will not work with
  351.     // arbitrary linear scale
  352.     $xscale->off = $tmp+$i*round(/*$xscale->ticks->major_step* */
  353.  $xscale->scale_factor*$subwidth);
  354.     $this->plots[$i]->Stroke($img,$xscale,$yscale);
  355. }
  356. $xscale->off=$tmp;
  357.     }
  358. } // Class
  359. //===================================================
  360. // CLASS AccBarPlot
  361. // Description: Produce accumulated bar plots
  362. //===================================================
  363. class AccBarPlot extends BarPlot {
  364.     var $plots=null,$nbrplots=0,$numpoints=0;
  365. //---------------
  366. // CONSTRUCTOR
  367.     function AccBarPlot($plots) {
  368. $this->plots = $plots;
  369. $this->nbrplots = count($plots);
  370. $this->numpoints = $plots[0]->numpoints;
  371. $this->value = new DisplayValue();
  372.     }
  373. //---------------
  374. // PUBLIC METHODS
  375.     function Legend(&$graph) {
  376. $n = count($this->plots);
  377. for( $i=$n-1; $i>=0; --$i ) 
  378.     $this->plots[$i]->DoLegend($graph);
  379.     }
  380.     function Max() {
  381. list($xmax) = $this->plots[0]->Max();
  382. $nmax=0;
  383. for($i=0; $i<count($this->plots); ++$i) {
  384.     $n = count($this->plots[$i]->coords[0]);
  385.     $nmax = max($nmax,$n);
  386.     list($x) = $this->plots[$i]->Max();
  387.     $xmax = max($xmax,$x);
  388. }
  389. for( $i = 0; $i < $nmax; $i++ ) {
  390.     // Get y-value for bar $i by adding the
  391.     // individual bars from all the plots added.
  392.     // It would be wrong to just add the
  393.     // individual plots max y-value since that
  394.     // would in most cases give to large y-value.
  395.     $y=$this->plots[0]->coords[0][$i];
  396.     for( $j = 1; $j < $this->nbrplots; $j++ ) {
  397. $y += $this->plots[ $j ]->coords[0][$i];
  398.     }
  399.     $ymax[$i] = $y;
  400. }
  401. $ymax = max($ymax);
  402. // Bar always start at baseline
  403. if( $ymax <= $this->ybase ) 
  404.     $ymax = $this->ybase;
  405. return array($xmax,$ymax);
  406.     }
  407.     function Min() {
  408. $nmax=0;
  409. list($xmin,$ysetmin) = $this->plots[0]->Min();
  410. for($i=0; $i<count($this->plots); ++$i) {
  411.     $n = count($this->plots[$i]->coords[0]);
  412.     $nmax = max($nmax,$n);
  413.     list($x,$y) = $this->plots[$i]->Min();
  414.     $xmin = Min($xmin,$x);
  415.     $ysetmin = Min($y,$ysetmin);
  416. }
  417. for( $i = 0; $i < $nmax; $i++ ) {
  418.     // Get y-value for bar $i by adding the
  419.     // individual bars from all the plots added.
  420.     // It would be wrong to just add the
  421.     // individual plots max y-value since that
  422.     // would in most cases give to large y-value.
  423.     $y=$this->plots[0]->coords[0][$i];
  424.     for( $j = 1; $j < $this->nbrplots; $j++ ) {
  425. $y += $this->plots[ $j ]->coords[0][$i];
  426.     }
  427.     $ymin[$i] = $y;
  428. }
  429. $ymin = Min($ysetmin,Min($ymin));
  430. // Bar always start at baseline
  431. if( $ymin >= $this->ybase )
  432.     $ymin = $this->ybase;
  433. return array($xmin,$ymin);
  434.     }
  435.     // Stroke acc bar plot
  436.     function Stroke(&$img,&$xscale,&$yscale) {
  437. $img->SetLineWeight($this->weight);
  438. for($i=0; $i<$this->numpoints-1; $i++) {
  439.     $accy = 0;
  440.     $accy_neg = 0; 
  441.     for($j=0; $j < $this->nbrplots; ++$j ) {
  442.     
  443. $img->SetColor($this->plots[$j]->color);
  444. if ( $this->plots[$j]->coords[0][$i] >= 0) {
  445.     $yt=$yscale->Translate($this->plots[$j]->coords[0][$i]+$accy);
  446.     $accyt=$yscale->Translate($accy);
  447.     $accy+=$this->plots[$j]->coords[0][$i];
  448. }
  449. if ( $this->plots[$j]->coords[0][$i] < 0 || $accy_neg < 0 ) {
  450.     $yt=$yscale->Translate($this->plots[$j]->coords[0][$i]+$accy_neg);
  451.     $accyt=$yscale->Translate($accy_neg);
  452.     $accy_neg+=$this->plots[$j]->coords[0][$i];
  453. }
  454. $xt=$xscale->Translate($i);
  455. if( $this->abswidth > -1 )
  456.     $abswidth=$this->abswidth;
  457. else
  458.     $abswidth=round($this->width*$xscale->scale_factor,0);
  459. $pts=array($xt,$accyt,$xt,$yt,$xt+$abswidth,$yt,$xt+$abswidth,$accyt);
  460. if( $this->bar_shadow ) {
  461.     $ssh = $this->bar_shadow_hsize;
  462.     $ssv = $this->bar_shadow_vsize;
  463.     
  464.     // We must also differ if we are a positive or negative bar. 
  465.     if( $j === 0 ) {
  466. // This gets extra complicated since we have to
  467. // see all plots to see if we are negative. It could
  468. // for example be that all plots are 0 until the very
  469. // last one. We therefore need to save the initial setup
  470. // for both the negative and positive case
  471. // In case the final bar is positive
  472. $sp[0]=$pts[6]+1; $sp[1]=$pts[7];
  473. $sp[2]=$pts[6]+$ssh; $sp[3]=$pts[7]-$ssv;
  474. // In case the final bar is negative
  475. $nsp[0]=$pts[0]; $nsp[1]=$pts[1];
  476. $nsp[2]=$pts[0]+$ssh; $nsp[3]=$pts[1]-$ssv;
  477. $nsp[4]=$pts[6]+$ssh; $nsp[5]=$pts[7]-$ssv;
  478. $nsp[10]=$pts[6]+1; $nsp[11]=$pts[7];
  479.     }
  480.     if( $j === $this->nbrplots-1 ) {
  481. // If this is the last plot of the bar and
  482. // the total value is larger than 0 then we
  483. // add the shadow.
  484. if( $accy > 0 ) {
  485.     $sp[4]=$pts[4]+$ssh; $sp[5]=$pts[5]-$ssv;
  486.     $sp[6]=$pts[2]+$ssh; $sp[7]=$pts[3]-$ssv;
  487.     $sp[8]=$pts[2]; $sp[9]=$pts[3]-1;
  488.     $sp[10]=$pts[4]+1; $sp[11]=$pts[5];
  489.     $img->PushColor($this->bar_shadow_color);
  490.     $img->FilledPolygon($sp,4);
  491.     $img->PopColor();
  492. }
  493. elseif( $accy_neg < 0 ) {
  494.     $nsp[6]=$pts[4]+$ssh; $nsp[7]=$pts[5]-$ssv;
  495.     $nsp[8]=$pts[4]+1; $nsp[9]=$pts[5];
  496.     $img->PushColor($this->bar_shadow_color);
  497.     $img->FilledPolygon($nsp,4);
  498.     $img->PopColor();
  499. }
  500.     }
  501. }
  502. // If value is NULL or 0, then don't draw a bar at all
  503. if ($this->plots[$j]->coords[0][$i] == 0 ) continue;
  504. if( $this->plots[$j]->grad ) {
  505.     $grad = new Gradient($img);
  506.     $grad->FilledRectangle(
  507. $pts[2],$pts[3],
  508. $pts[6],$pts[7],
  509. $this->plots[$j]->grad_fromcolor,
  510. $this->plots[$j]->grad_tocolor,
  511. $this->plots[$j]->grad_style);
  512. } elseif ($this->plots[$j]->fill_color ) {
  513.     $img->SetColor($this->plots[$j]->fill_color);
  514.     $img->FilledPolygon($pts);
  515.     $img->SetColor($this->plots[$j]->color);
  516. }   
  517. // CSIM array
  518. if( $i < count($this->plots[$j]->csimtargets) ) {
  519.     // Create the client side image map
  520.     $rpts = $img->ArrRotate($pts);
  521.     $csimcoord=round($rpts[0]).", ".round($rpts[1]);
  522.     for( $k=1; $k < 4; ++$k){
  523. $csimcoord .= ", ".round($rpts[2*$k]).", ".round($rpts[2*$k+1]);
  524.     }          
  525.     $this->csimareas.= '<area shape="poly" coords="'.$csimcoord.'" '; 
  526.     $this->csimareas.= " href="".$this->plots[$j]->csimtargets[$i].""";
  527.     if( !empty($this->plots[$j]->csimalts[$i]) ) {
  528. $sval=sprintf($this->plots[$j]->csimalts[$i],$this->plots[$j]->coords[0][$i]);
  529. $this->csimareas .= " alt="$sval" title="$sval" ";
  530.     }
  531.     $this->csimareas .= ">n";
  532. }
  533. $pts[] = $pts[0];
  534. $pts[] = $pts[1];
  535. $img->Polygon($pts);
  536.     }
  537.     // Draw labels for each acc.bar
  538.     $x=$pts[2]+($pts[4]-$pts[2])/2;
  539.     $y=$yscale->Translate($accy);
  540.     if($this->bar_shadow) $x += $ssh;
  541.     $this->value->Stroke($img,$accy,$x,$y);
  542.     $accy = 0;
  543.     $accy_neg = 0; 
  544.     for($j=0; $j<$this->nbrplots; ++$j ) {
  545. if ($this->plots[$j]->coords[0][$i] > 0) {
  546.     $yt=$yscale->Translate($this->plots[$j]->coords[0][$i]+$accy);
  547.     $accyt=$yscale->Translate($accy);
  548.     $y = $accyt-($accyt-$yt)/2;
  549.     $accy+=$this->plots[$j]->coords[0][$i];
  550. } else {
  551.     $yt=$yscale->Translate($this->plots[$j]->coords[0][$i]+$accy_neg);
  552.     $accyt=$yscale->Translate($accy_neg);
  553.     $y=0;
  554.     $accy_neg+=$this->plots[$j]->coords[0][$i];
  555. }
  556. $this->plots[$j]->value->SetAlign("center","center");
  557. $this->plots[$j]->value->SetMargin(0);
  558. $this->plots[$j]->value->Stroke($img,$this->plots[$j]->coords[0][$i],$x,$y);
  559.     }
  560. }
  561. return true;
  562.     }
  563. } // Class
  564. /* EOF */
  565. ?>