Subversion Repositories Sites.tela-botanica.org

Rev

Rev 609 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
7 david 1
<?php
2
/*=======================================================================
3
// File: 	JPGRAPH_STOCK.PHP
4
// Description:	Stock plot extension for JpGraph
5
// Created: 	2003-01-27
6
// Author:	Johan Persson (johanp@aditus.nu)
7
// Ver:		$Id: jpgraph_stock.php,v 1.1 2004/06/15 10:13:19 jpm Exp $
8
//
9
// License:	This code is released under QPL
10
// Copyright (C) 2003 Johan Persson
11
//========================================================================
12
*/
13
 
14
//===================================================
15
// CLASS StockPlot
16
//===================================================
17
class StockPlot extends Plot {
18
    var $iWidth=9;
19
    var $iEndLines=1;
20
    var $iStockColor1='white',$iStockColor2='darkred',$iStockColor3='darkred';
21
    var $iTupleSize = 4;
22
//---------------
23
// CONSTRUCTOR
24
    function StockPlot(&$datay,$datax=false) {
25
	if( count($datay) % $this->iTupleSize ) {
26
	    JpGraphError::Raise('Data values for Stock charts must contain an even multiple of '.$this->iTupleSize.' data points.');
27
	}
28
	$this->Plot($datay,$datax);
29
	$this->numpoints /= $this->iTupleSize;
30
    }
31
//---------------
32
// PUBLIC METHODS
33
 
34
    function SetColor($aColor,$aColor1='white',$aColor2='darkred',$aColor3='darkred') {
35
	$this->color = $aColor;
36
	$this->iStockColor1 = $aColor1;
37
	$this->iStockColor2 = $aColor2;
38
	$this->iStockColor3 = $aColor3;
39
    }
40
 
41
    function SetWidth($aWidth) {
42
	// Make sure it's odd
43
	$this->iWidth = 2*floor($aWidth/2)+1;
44
    }
45
 
46
    function HideEndLines($aHide=true) {
47
	$this->iEndLines = !$aHide;
48
    }
49
 
50
    // Gets called before any axis are stroked
51
    function PreStrokeAdjust(&$graph) {
52
	if( $this->center ) {
53
	    $a=0.5; $b=0.5;
54
	    $this->numpoints++;
55
	} else {
56
	    $a=0; $b=0;
57
	}
58
	$graph->xaxis->scale->ticks->SetXLabelOffset($a);
59
	$graph->SetTextScaleOff($b);
60
    }
61
 
62
    // Method description
63
    function Stroke($img,$xscale,$yscale) {
64
	$n=$this->numpoints;
65
	if( $this->center ) $n--;
66
	if( isset($this->coords[1]) ) {
67
	    if( count($this->coords[1])!=$n )
68
		JpGraphError::Raise("Number of X and Y points are not equal. Number of X-points:".count($this->coords[1])." Number of Y-points:$numpoints");
69
	    else
70
		$exist_x = true;
71
	}
72
	else
73
	    $exist_x = false;
74
 
75
	if( $exist_x )
76
	    $xs=$this->coords[1][0];
77
	else
78
	    $xs=0;
79
 
80
	$ts = $this->iTupleSize;
81
	$this->csimareas = '';
82
	for( $i=0; $i<$n; ++$i) {
83
 
84
	    //If value is NULL, then don't draw a bar at all
85
 	    if ($this->coords[0][$i] === null) continue;
86
 
87
	    if( $exist_x ) $x=$this->coords[1][$i];
88
	    else $x=$i;
89
	    $xt = $xscale->Translate($x);
90
 
91
	    $neg = $this->coords[0][$i*4] > $this->coords[0][$i*$ts+1] ;
92
	    $yopen  = $yscale->Translate($this->coords[0][$i*$ts]);
93
	    $yclose = $yscale->Translate($this->coords[0][$i*$ts+1]);
94
	    $ymin   = $yscale->Translate($this->coords[0][$i*$ts+2]);
95
	    $ymax   = $yscale->Translate($this->coords[0][$i*$ts+3]);
96
 
97
	    $dx = floor($this->iWidth/2);
98
	    $xl = $xt - $dx;
99
	    $xr = $xt + $dx;
100
 
101
	    if( $neg )
102
		$img->SetColor($this->iStockColor3);
103
	    else
104
		$img->SetColor($this->iStockColor1);
105
	    $img->FilledRectangle($xl,$yopen,$xr,$yclose);
106
	    $img->SetLineWeight($this->weight);
107
	    if( $neg )
108
		$img->SetColor($this->iStockColor2);
109
	    else
110
		$img->SetColor($this->color);
111
 
112
	    $img->Rectangle($xl,$yopen,$xr,$yclose);
113
 
114
	    if( $yopen < $yclose ) {
115
		$ytop = $yopen ;
116
		$ybottom = $yclose ;
117
	    }
118
	    else {
119
		$ytop = $yclose ;
120
		$ybottom = $yopen ;
121
	    }
122
	    $img->SetColor($this->color);
123
	    $img->Line($xt,$ytop,$xt,$ymax);
124
	    $img->Line($xt,$ybottom,$xt,$ymin);
125
 
126
	    if( $this->iEndLines ) {
127
		$img->Line($xl,$ymax,$xr,$ymax);
128
		$img->Line($xl,$ymin,$xr,$ymin);
129
	    }
130
 
131
	    // A chance for subclasses to add things to the bar
132
	    // for data point i
133
	    $this->ModBox($img,$xscale,$yscale,$i,$xl,$xr,$neg);
134
 
135
	    // Setup image maps
136
	    if( !empty($this->csimtargets[$i]) ) {
137
		$this->csimareas.= '<area shape="rect" coords="'.
138
		    round($xl).','.round($ytop).','.
139
		    round($xr).','.round($ybottom).'" ';
140
		$this->csimareas .= ' href="'.$this->csimtargets[$i].'"';
141
		if( !empty($this->csimalts[$i]) ) {
142
		    $sval=$this->csimalts[$i];
143
		    $this->csimareas .= " alt=\"$sval\" title=\"$sval\" ";
144
		}
145
		$this->csimareas.= ">\n";
146
	    }
147
	}
148
	return true;
149
    }
150
 
151
    // A hook for subclasses to modify the plot
152
    function ModBox($img,$xscale,$yscale,$i,$xl,$xr,$neg) {}
153
 
154
} // Class
155
 
156
//===================================================
157
// CLASS BoxPlot
158
//===================================================
159
class BoxPlot extends StockPlot {
160
    var $iPColor='black',$iNColor='white';
161
    function BoxPlot($datay,$datax=false) {
162
	$this->iTupleSize=5;
163
	parent::StockPlot($datay,$datax);
164
    }
165
 
166
    function SetMedianColor($aPos,$aNeg) {
167
	$this->iPColor = $aPos;
168
	$this->iNColor = $aNeg;
169
    }
170
 
171
    function ModBox($img,$xscale,$yscale,$i,$xl,$xr,$neg) {
172
	if( $neg )
173
	    $img->SetColor($this->iNColor);
174
	else
175
	    $img->SetColor($this->iPColor);
176
 
177
	$y = $yscale->Translate($this->coords[0][$i*5+4]);
178
	$img->Line($xl,$y,$xr,$y);
179
    }
180
}
181
 
182
/* EOF */
183
?>