⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jpgraph_bar.php

📁 一个基于web的开源项目管理工具
💻 PHP
📖 第 1 页 / 共 2 页
字号:
		$this->value->Stroke($img,$val,$x,$y);	    }	    elseif( $this->valuepos=='center' ) {		$y = ($pts[3] + $pts[1])/2;		$this->value->SetAlign('center','center');		$this->value->SetMargin(0);		$this->value->Stroke($img,$val,$x,$y);	    }	    elseif( $this->valuepos=='bottom' || $this->valuepos=='min' ) {		$y=$pts[1];		if( $img->a === 90 ) {		    if( $val < 0 )			$this->value->SetAlign('right','center');		    else			$this->value->SetAlign('left','center');		    		    		}		$this->value->SetMargin(3);		$this->value->Stroke($img,$val,$x,$y);	    }	    else {		JpGraphError::RaiseL(2006,$this->valuepos);//('Unknown position for values on bars :'.$this->valuepos);	    }	    // Create the client side image map	    $rpts = $img->ArrRotate($pts);			    $csimcoord=round($rpts[0]).", ".round($rpts[1]);	    for( $j=1; $j < 4; ++$j){		$csimcoord .= ", ".round($rpts[2*$j]).", ".round($rpts[2*$j+1]);	    }	    	    	    if( !empty($this->csimtargets[$i]) ) {		$this->csimareas .= '<area shape="poly" coords="'.$csimcoord.'" ';    	    		$this->csimareas .= " href=\"".$this->csimtargets[$i]."\"";		$sval='';		if( !empty($this->csimalts[$i]) ) {		    $sval=sprintf($this->csimalts[$i],$this->coords[0][$i]);		    $this->csimareas .= " title=\"$sval\" ";		}		$this->csimareas .= " alt=\"$sval\" />\n";	    }	}	return true;    }} // Class//===================================================// CLASS GroupBarPlot// Description: Produce grouped bar plots//===================================================class GroupBarPlot extends BarPlot {    var $plots;    var $width=0.7;    var $nbrplots=0;    var $numpoints;//---------------// CONSTRUCTOR    function GroupBarPlot($plots) {	$this->plots = $plots;	$this->nbrplots = count($plots);	if( $this->nbrplots < 1 ) {	    JpGraphError::RaiseL(2007);//('Cannot create GroupBarPlot from empty plot array.');	}	for($i=0; $i < $this->nbrplots; ++$i ) {	    if( empty($this->plots[$i]) || !isset($this->plots[$i]) ) {		JpGraphError::RaiseL(2008,$i);//("Group bar plot element nbr $i is undefined or empty.");	    }	}	$this->numpoints = $plots[0]->numpoints;    }//---------------// PUBLIC METHODS	    function Legend(&$graph) {	$n = count($this->plots);	for($i=0; $i < $n; ++$i) {	    $c = get_class($this->plots[$i]);	    if( !is_a($this->plots[$i],'BarPlot') ) {		JpGraphError::RaiseL(2009,$c);//('One of the objects submitted to GroupBar is not a BarPlot. Make sure that you create the Group Bar plot from an array of BarPlot or AccBarPlot objects. (Class = '.$c.')');	    }	    $this->plots[$i]->DoLegend($graph);	}    }	    function Min() {	list($xmin,$ymin) = $this->plots[0]->Min();	$n = count($this->plots);	for($i=0; $i < $n; ++$i) {	    list($xm,$ym) = $this->plots[$i]->Min();	    $xmin = max($xmin,$xm);	    $ymin = min($ymin,$ym);	}	return array($xmin,$ymin);		    }	    function Max() {	list($xmax,$ymax) = $this->plots[0]->Max();	$n = count($this->plots);	for($i=0; $i < $n; ++$i) {	    list($xm,$ym) = $this->plots[$i]->Max();	    $xmax = max($xmax,$xm);	    $ymax = max($ymax,$ym);	}	return array($xmax,$ymax);    }	    function GetCSIMareas() {	$n = count($this->plots);	$csimareas='';	for($i=0; $i < $n; ++$i) {	    $csimareas .= $this->plots[$i]->csimareas;	}	return $csimareas;    }	    // Stroke all the bars next to each other    function Stroke(&$img,&$xscale,&$yscale) { 	$tmp=$xscale->off;	$n = count($this->plots);	$subwidth = $this->width/$this->nbrplots ; 	for( $i=0; $i < $n; ++$i ) {	    $this->plots[$i]->ymin=$this->ybase;	    $this->plots[$i]->SetWidth($subwidth);	    	    // If the client have used SetTextTickInterval() then	    // major_step will be > 1 and the positioning will fail.	    // If we assume it is always one the positioning will work	    // fine with a text scale but this will not work with	    // arbitrary linear scale	    $xscale->off = $tmp+$i*round(/*$xscale->ticks->major_step* */					$xscale->scale_factor* $subwidth);	    $this->plots[$i]->Stroke($img,$xscale,$yscale);	}	$xscale->off=$tmp;    }} // Class//===================================================// CLASS AccBarPlot// Description: Produce accumulated bar plots//===================================================class AccBarPlot extends BarPlot {    var $plots=null,$nbrplots=0,$numpoints=0;//---------------// CONSTRUCTOR    function AccBarPlot($plots) {	$this->plots = $plots;	$this->nbrplots = count($plots);	if( $this->nbrplots < 1 ) {	    JpGraphError::RaiseL(2010);//('Cannot create AccBarPlot from empty plot array.');	}	for($i=0; $i < $this->nbrplots; ++$i ) {	    if( empty($this->plots[$i]) || !isset($this->plots[$i]) ) {		JpGraphError::RaiseL(2011,$i);//("Acc bar plot element nbr $i is undefined or empty.");	    }	}	$this->numpoints = $plots[0]->numpoints;			$this->value = new DisplayValue();    }//---------------// PUBLIC METHODS	    function Legend(&$graph) {	$n = count($this->plots);	for( $i=$n-1; $i >= 0; --$i ) {	    $c = get_class($this->plots[$i]);	    if( !is_a($this->plots[$i],'BarPlot') ) {		JpGraphError::RaiseL(2012,$c);//('One of the objects submitted to AccBar is not a BarPlot. Make sure that you create the AccBar plot from an array of BarPlot objects.(Class='.$c.')');	    }	    	    $this->plots[$i]->DoLegend($graph);	}    }    function Max() {	list($xmax) = $this->plots[0]->Max();	$nmax=0;	for($i=0; $i < count($this->plots); ++$i) {	    $n = count($this->plots[$i]->coords[0]);	    $nmax = max($nmax,$n);	    list($x) = $this->plots[$i]->Max();	    $xmax = max($xmax,$x);	}	for( $i = 0; $i < $nmax; $i++ ) {	    // Get y-value for bar $i by adding the	    // individual bars from all the plots added.	    // It would be wrong to just add the	    // individual plots max y-value since that	    // would in most cases give to large y-value.	    $y=0;	    if( !isset($this->plots[0]->coords[0][$i]) ) {		JpGraphError::RaiseL(2014);	    }	    if( $this->plots[0]->coords[0][$i] > 0 )		$y=$this->plots[0]->coords[0][$i];	    for( $j = 1; $j < $this->nbrplots; $j++ ) {		if( !isset($this->plots[$j]->coords[0][$i]) ) {		    JpGraphError::RaiseL(2014);		}		if( $this->plots[$j]->coords[0][$i] > 0 )		    $y += $this->plots[$j]->coords[0][$i];	    }	    $ymax[$i] = $y;	}	$ymax = max($ymax);	// Bar always start at baseline	if( $ymax <= $this->ybase ) 	    $ymax = $this->ybase;	return array($xmax,$ymax);    }    function Min() {	$nmax=0;	list($xmin,$ysetmin) = $this->plots[0]->Min();	for($i=0; $i < count($this->plots); ++$i) {	    $n = count($this->plots[$i]->coords[0]);	    $nmax = max($nmax,$n);	    list($x,$y) = $this->plots[$i]->Min();	    $xmin = Min($xmin,$x);	    $ysetmin = Min($y,$ysetmin);	}	for( $i = 0; $i < $nmax; $i++ ) {	    // Get y-value for bar $i by adding the	    // individual bars from all the plots added.	    // It would be wrong to just add the	    // individual plots max y-value since that	    // would in most cases give to large y-value.	    $y=0;	    if( $this->plots[0]->coords[0][$i] < 0 )		$y=$this->plots[0]->coords[0][$i];	    for( $j = 1; $j < $this->nbrplots; $j++ ) {		if( $this->plots[$j]->coords[0][$i] < 0 )		    $y += $this->plots[ $j ]->coords[0][$i];	    }	    $ymin[$i] = $y;	}	$ymin = Min($ysetmin,Min($ymin));	// Bar always start at baseline	if( $ymin >= $this->ybase )	    $ymin = $this->ybase;	return array($xmin,$ymin);    }    // Stroke acc bar plot    function Stroke(&$img,&$xscale,&$yscale) {	$pattern=NULL;	$img->SetLineWeight($this->weight);	for($i=0; $i < $this->numpoints-1; $i++) {	    $accy = 0;	    $accy_neg = 0; 	    for($j=0; $j < $this->nbrplots; ++$j ) {						$img->SetColor($this->plots[$j]->color);		if ( $this->plots[$j]->coords[0][$i] >= 0) {		    $yt=$yscale->Translate($this->plots[$j]->coords[0][$i]+$accy);		    $accyt=$yscale->Translate($accy);		    $accy+=$this->plots[$j]->coords[0][$i];		}		else {		    //if ( $this->plots[$j]->coords[0][$i] < 0 || $accy_neg < 0 ) {		    $yt=$yscale->Translate($this->plots[$j]->coords[0][$i]+$accy_neg);		    $accyt=$yscale->Translate($accy_neg);		    $accy_neg+=$this->plots[$j]->coords[0][$i];		}										$xt=$xscale->Translate($i);		if( $this->abswidth > -1 )		    $abswidth=$this->abswidth;		else		    $abswidth=round($this->width*$xscale->scale_factor,0);				$pts=array($xt,$accyt,$xt,$yt,$xt+$abswidth,$yt,$xt+$abswidth,$accyt);		if( $this->bar_shadow ) {		    $ssh = $this->bar_shadow_hsize;		    $ssv = $this->bar_shadow_vsize;		    		    // We must also differ if we are a positive or negative bar. 		    if( $j === 0 ) {			// This gets extra complicated since we have to			// see all plots to see if we are negative. It could			// for example be that all plots are 0 until the very			// last one. We therefore need to save the initial setup			// for both the negative and positive case			// In case the final bar is positive			$sp[0]=$pts[6]+1; $sp[1]=$pts[7];			$sp[2]=$pts[6]+$ssh; $sp[3]=$pts[7]-$ssv;			// In case the final bar is negative			$nsp[0]=$pts[0]; $nsp[1]=$pts[1];			$nsp[2]=$pts[0]+$ssh; $nsp[3]=$pts[1]-$ssv;			$nsp[4]=$pts[6]+$ssh; $nsp[5]=$pts[7]-$ssv;			$nsp[10]=$pts[6]+1; $nsp[11]=$pts[7];		    }		    if( $j === $this->nbrplots-1 ) {			// If this is the last plot of the bar and			// the total value is larger than 0 then we			// add the shadow.			if( is_array($this->bar_shadow_color) ) {			    $numcolors = count($this->bar_shadow_color);			    if( $numcolors == 0 ) {				JpGraphError::RaiseL(2013);//('You have specified an empty array for shadow colors in the bar plot.');			    }			    $img->PushColor($this->bar_shadow_color[$i % $numcolors]);			}			else {			    $img->PushColor($this->bar_shadow_color);			}			if( $accy > 0 ) {			    $sp[4]=$pts[4]+$ssh; $sp[5]=$pts[5]-$ssv;			    $sp[6]=$pts[2]+$ssh; $sp[7]=$pts[3]-$ssv;			    $sp[8]=$pts[2]; $sp[9]=$pts[3]-1;			    $sp[10]=$pts[4]+1; $sp[11]=$pts[5];			    $img->FilledPolygon($sp,4);			}			elseif( $accy_neg < 0 ) {			    $nsp[6]=$pts[4]+$ssh; $nsp[7]=$pts[5]-$ssv;			    $nsp[8]=$pts[4]+1; $nsp[9]=$pts[5];			    $img->FilledPolygon($nsp,4);			}			$img->PopColor();		    }		}		// If value is NULL or 0, then don't draw a bar at all		if ($this->plots[$j]->coords[0][$i] == 0 ) continue;		if( $this->plots[$j]->grad ) {		    $grad = new Gradient($img);		    $grad->FilledRectangle(			$pts[2],$pts[3],			$pts[6],$pts[7],			$this->plots[$j]->grad_fromcolor,			$this->plots[$j]->grad_tocolor,			$this->plots[$j]->grad_style);						} else {		    if (is_array($this->plots[$j]->fill_color) ) {			$numcolors = count($this->plots[$j]->fill_color);			$img->SetColor($this->plots[$j]->fill_color[$i % $numcolors]);		    }		    else {			$img->SetColor($this->plots[$j]->fill_color);		    }		    $img->FilledPolygon($pts);		    $img->SetColor($this->plots[$j]->color);		}				  		// Stroke the pattern		if( $this->plots[$j]->iPattern > -1 ) {		    if( $pattern===NULL ) 			$pattern = new RectPatternFactory();				    $prect = $pattern->Create($this->plots[$j]->iPattern,$this->plots[$j]->iPatternColor,1);		    $prect->SetDensity($this->plots[$j]->iPatternDensity);		    if( $this->plots[$j]->coords[0][$i] < 0 ) {			$rx = $pts[0];			$ry = $pts[1];		    }		    else {			$rx = $pts[2];			$ry = $pts[3];		    }		    $width = abs($pts[4]-$pts[0])+1;		    $height = abs($pts[1]-$pts[3])+1;		    $prect->SetPos(new Rectangle($rx,$ry,$width,$height));		    $prect->Stroke($img);		}		// CSIM array		if( $i < count($this->plots[$j]->csimtargets) ) {		    // Create the client side image map		    $rpts = $img->ArrRotate($pts);				    $csimcoord=round($rpts[0]).", ".round($rpts[1]);		    for( $k=1; $k < 4; ++$k){			$csimcoord .= ", ".round($rpts[2*$k]).", ".round($rpts[2*$k+1]);		    }	    	    		    if( ! empty($this->plots[$j]->csimtargets[$i]) ) {			$this->csimareas.= '<area shape="poly" coords="'.$csimcoord.'" '; 			$this->csimareas.= " href=\"".$this->plots[$j]->csimtargets[$i]."\"";			if( !empty($this->plots[$j]->csimalts[$i]) ) {			    $sval=sprintf($this->plots[$j]->csimalts[$i],$this->plots[$j]->coords[0][$i]);			    $this->csimareas .= " title=\"$sval\" ";			}			$this->csimareas .= " alt=\"$sval\" />\n";						    }		}		$pts[] = $pts[0];		$pts[] = $pts[1];		$img->Polygon($pts);	    }			    // Draw labels for each acc.bar		    $x=$pts[2]+($pts[4]-$pts[2])/2;	    if($this->bar_shadow) $x += $ssh;	    // First stroke the accumulated value for the entire bar	    // This value is always placed at the top/bottom of the bars	    if( $accy_neg < 0 ) {		$y=$yscale->Translate($accy_neg);					$this->value->Stroke($img,$accy_neg,$x,$y);	    }	    else {		$y=$yscale->Translate($accy);					$this->value->Stroke($img,$accy,$x,$y);	    }	    $accy = 0;	    $accy_neg = 0; 	    for($j=0; $j < $this->nbrplots; ++$j ) {			// We don't print 0 values in an accumulated bar plot		if( $this->plots[$j]->coords[0][$i] == 0 ) continue;					if ($this->plots[$j]->coords[0][$i] > 0) {		    $yt=$yscale->Translate($this->plots[$j]->coords[0][$i]+$accy);		    $accyt=$yscale->Translate($accy);		    if(  $this->plots[$j]->valuepos=='center' ) {			$y = $accyt-($accyt-$yt)/2;		    }		    elseif( $this->plots[$j]->valuepos=='bottom' ) {			$y = $accyt;		    }		    else { // top or max			$y = $accyt-($accyt-$yt);		    }		    $accy+=$this->plots[$j]->coords[0][$i];		    if(  $this->plots[$j]->valuepos=='center' ) {			$this->plots[$j]->value->SetAlign("center","center");			$this->plots[$j]->value->SetMargin(0);		    }		    elseif( $this->plots[$j]->valuepos=='bottom' ) {			$this->plots[$j]->value->SetAlign('center','bottom');			$this->plots[$j]->value->SetMargin(2);		    }		    else {			$this->plots[$j]->value->SetAlign('center','top');			$this->plots[$j]->value->SetMargin(1);		    }		} else {		    $yt=$yscale->Translate($this->plots[$j]->coords[0][$i]+$accy_neg);		    $accyt=$yscale->Translate($accy_neg);		    $accy_neg+=$this->plots[$j]->coords[0][$i];		    if(  $this->plots[$j]->valuepos=='center' ) {			$y = $accyt-($accyt-$yt)/2;		    }		    elseif( $this->plots[$j]->valuepos=='bottom' ) {			$y = $accyt;		    }		    else {			$y = $accyt-($accyt-$yt);		    }		    if(  $this->plots[$j]->valuepos=='center' ) {			$this->plots[$j]->value->SetAlign("center","center");			$this->plots[$j]->value->SetMargin(0);		    }		    elseif( $this->plots[$j]->valuepos=='bottom' ) {			$this->plots[$j]->value->SetAlign('center',$j==0 ? 'bottom':'top');			$this->plots[$j]->value->SetMargin(-2);		    }		    else {			$this->plots[$j]->value->SetAlign('center','bottom');			$this->plots[$j]->value->SetMargin(-1);		    }		}			$this->plots[$j]->value->Stroke($img,$this->plots[$j]->coords[0][$i],$x,$y);	    }	}	return true;    }} // Class/* EOF */?>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -