1<?php 2/* 3 * This work is hereby released into the Public Domain. 4 * To view a copy of the public domain dedication, 5 * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to 6 * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. 7 * 8 */ 9 10require_once dirname(__FILE__)."/Plot.class.php"; 11 12/** 13 * BarPlot 14 * 15 * @package Artichow 16 */ 17class awBarPlot extends awPlot { 18 19 /** 20 * Labels on your bar plot 21 * 22 * @var Label 23 */ 24 var $label; 25 26 /** 27 * Bar plot identifier 28 * 29 * @var int 30 */ 31 var $identifier; 32 33 /** 34 * Bar plot number 35 * 36 * @var int 37 */ 38 var $number; 39 40 /** 41 * Bar plot depth 42 * 43 * @var int 44 */ 45 var $depth; 46 47 /** 48 * For moving bars 49 * 50 * @var int 51 */ 52 var $move; 53 54 /** 55 * Bars shadow 56 * 57 * @var Shadow 58 */ 59 var $barShadow; 60 61 /** 62 * Bars border 63 * 64 * @var Border 65 */ 66 var $barBorder; 67 68 /** 69 * Bars padding 70 * 71 * @var Side 72 */ 73 var $barPadding; 74 75 /** 76 * Bars space 77 * 78 * @var int 79 */ 80 var $barSpace = 0; 81 82 /** 83 * Bars background 84 * 85 * @var Color, Gradient 86 */ 87 var $barBackground; 88 89 /** 90 * Construct a new awBarPlot 91 * 92 * @param array $values Some numeric values for Y axis 93 * @param int $identifier Plot identifier 94 * @param int $number Bar plot number 95 * @param int $depth Bar plot depth in pixels 96 */ 97 function awBarPlot($values, $identifier = 1, $number = 1, $depth = 0) { 98 99 parent::awPlot(); 100 101 $this->label = new awLabel; 102 103 $this->barPadding = new awSide(0.08, 0.08, 0, 0); 104 $this->barShadow = new awShadow(SHADOW_RIGHT_TOP); 105 $this->barBorder = new awBorder; 106 107 $this->setValues($values); 108 109 $this->identifier = (int)$identifier; 110 $this->number = (int)$number; 111 $this->depth = (int)$depth; 112 113 $this->move = new awSide; 114 115 // Hide vertical grid 116 $this->grid->hideVertical(TRUE); 117 118 } 119 120 /** 121 * Change bars padding 122 * This method is not compatible with awBarPlot::setBarPadding() 123 * 124 * @param float $left Left padding (between 0 and 1) 125 * @param float $right Right padding (between 0 and 1) 126 */ 127 function setBarPadding($left = NULL, $right = NULL) { 128 $this->barPadding->set($left, $right); 129 } 130 131 /** 132 * Change bars size 133 * This method is not compatible with awBarPlot::setBarPadding() 134 * 135 * @param int $width Bars size (between 0 and 1) 136 */ 137 function setBarSize($size) { 138 $padding = (1 - $size) / 2; 139 $this->barPadding->set($padding, $padding); 140 } 141 142 /** 143 * Move bars 144 * 145 * @param int $x 146 * @param int $y 147 */ 148 function move($x, $y) { 149 $this->move->set($x, NULL, $y, NULL); 150 } 151 152 /** 153 * Change bars space 154 * 155 * @param int $space Space in pixels 156 */ 157 function setBarSpace($space) { 158 $this->barSpace = (int)$space; 159 } 160 161 /** 162 * Change line background color 163 * 164 * @param $color 165 */ 166 function setBarColor($color) { 167 $this->barBackground = $color; 168 } 169 170 /** 171 * Change line background gradient 172 * 173 * @param $gradient 174 */ 175 function setBarGradient($gradient) { 176 $this->barBackground = $gradient; 177 } 178 179 /** 180 * Get the line thickness 181 * 182 * @return int 183 */ 184 function getLegendLineThickness() { 185 } 186 187 /** 188 * Get the line type 189 * 190 * @return int 191 */ 192 function getLegendLineStyle() { 193 } 194 195 /** 196 * Get the color of line 197 * 198 * @return Color 199 */ 200 function getLegendLineColor() { 201 } 202 203 /** 204 * Get the background color or gradient of an element of the component 205 * 206 * @return Color, Gradient 207 */ 208 function getLegendBackground() { 209 return $this->barBackground; 210 } 211 212 /** 213 * Get a mark object 214 * 215 * @return Mark 216 */ 217 function getLegendMark() { 218 } 219 220 function drawComponent($drawer, $x1, $y1, $x2, $y2, $aliasing) { 221 222 $count = count($this->datay); 223 $max = $this->getRealYMax(NULL); 224 $min = $this->getRealYMin(NULL); 225 226 // Find zero for bars 227 if($this->xAxisZero and $min <= 0 and $max >= 0) { 228 $zero = 0; 229 } else if($max < 0) { 230 $zero = $max; 231 } else { 232 $zero = $min; 233 } 234 235 // Get base position 236 $zero = awAxis::toPosition($this->xAxis, $this->yAxis, new awPoint(0, $zero)); 237 238 // Distance between two values on the graph 239 $distance = $this->xAxis->getDistance(0, 1); 240 241 // Compute paddings 242 $leftPadding = $this->barPadding->left * $distance; 243 $rightPadding = $this->barPadding->right * $distance; 244 245 $padding = $leftPadding + $rightPadding; 246 $space = $this->barSpace * ($this->number - 1); 247 248 $barSize = ($distance - $padding - $space) / $this->number; 249 $barPosition = $leftPadding + $barSize * ($this->identifier - 1); 250 251 for($key = 0; $key < $count; $key++) { 252 253 $value = $this->datay[$key]; 254 255 if($value !== NULL) { 256 257 $position = awAxis::toPosition( 258 $this->xAxis, 259 $this->yAxis, 260 new awPoint($key, $value) 261 ); 262 263 $barStart = $barPosition + ($this->identifier - 1) * $this->barSpace + $position->x; 264 $barStop = $barStart + $barSize; 265 266 $t1 = min($zero->y, $position->y); 267 $t2 = max($zero->y, $position->y); 268 269 if(round($t2 - $t1) == 0) { 270 continue; 271 } 272 273 $p1 = new awPoint( 274 round($barStart) + $this->depth + $this->move->left, 275 round($t1) - $this->depth + $this->move->top 276 ); 277 278 $p2 = new awPoint( 279 round($barStop) + $this->depth + $this->move->left, 280 round($t2) - $this->depth + $this->move->top 281 ); 282 283 $this->drawBar($drawer, $p1, $p2); 284 285 } 286 287 } 288 289 // Draw labels 290 foreach($this->datay as $key => $value) { 291 292 if($value !== NULL) { 293 294 $position = awAxis::toPosition( 295 $this->xAxis, 296 $this->yAxis, 297 new awPoint($key, $value) 298 ); 299 300 $point = new awPoint( 301 $barPosition + ($this->identifier - 1) * $this->barSpace + $position->x + $barSize / 2 + 1 + $this->depth, 302 $position->y - $this->depth 303 ); 304 305 $this->label->draw($drawer, $point, $key); 306 307 } 308 309 } 310 311 } 312 313 function getXAxisNumber() { 314 return count($this->datay) + 1; 315 } 316 // ça bidouille à fond ici ! 317 function getXMax() { 318 return array_max($this->datax) + 1; 319 } 320 321 function getXCenter() { 322 return TRUE; 323 } 324 325 function drawBar($drawer, $p1, $p2) { 326 327 // Draw shadow 328 $this->barShadow->draw( 329 $drawer, 330 $p1, 331 $p2, 332 SHADOW_OUT 333 ); 334 335 if(abs($p2->y - $p1->y) > 1) { 336 337 $this->barBorder->rectangle( 338 $drawer, 339 $p1, 340 $p2 341 ); 342 343 if($this->barBackground !== NULL) { 344 345 $size = $this->barBorder->visible() ? 1 : 0; 346 347 $b1 = $p1->move($size, $size); 348 $b2 = $p2->move(-1 * $size, -1 * $size); 349 350 // Draw background 351 $drawer->filledRectangle( 352 $this->barBackground, 353 new awLine($b1, $b2) 354 ); 355 356 } 357 358 } 359 } 360 361} 362 363registerClass('BarPlot'); 364?> 365