questlab/www/analytics/libs/sparkline/lib/Sparkline_Bar.php

196 lines
6.7 KiB
PHP

<?php
/*
* Sparkline PHP Graphing Library
* Copyright 2004 James Byers <jbyers@gmail.com>
* http://sparkline.org
*
* Dual-licensed under the BSD (LICENSE-BSD.txt) and GPL (LICENSE-GPL.txt)
* licenses.
*
* $Id: Sparkline_Bar.php,v 1.3 2008/03/11 19:12:49 jbyers Exp $
*
*/
require_once dirname(__FILE__).'/Sparkline.php';
class Sparkline_Bar extends Sparkline {
var $dataSeries;
var $dataSeriesStats;
var $dataSeriesConverted;
var $yMin;
var $yMax;
var $barWidth;
var $barSpacing;
var $barColorDefault;
var $barColorUnderscoreDefault;
////////////////////////////////////////////////////////////////////////////
// constructor
//
function Sparkline_Bar($catch_errors = true) {
parent::Sparkline($catch_errors);
$this->dataSeries = array();
$this->dataSeriesStats = array();
$this->dataSeriesConverted = array();
$this->barWidth = 1;
$this->barSpacing = 1;
$this->barColorDefault = 'black';
$this->barColorUnderscoreDefault = 'black';
} // function Sparkline
////////////////////////////////////////////////////////////////////////////
// color, image property setting
//
function SetBarWidth($value) {
$this->Debug("Sparkline_Bar :: SetBarWidth($value)", DEBUG_SET);
$this->barWidth = $value;
} // function SetBarWidth
function SetBarSpacing($value) {
$this->Debug("Sparkline_Bar :: SetBarSpacing($value)", DEBUG_SET);
$this->barSpacing = $value;
} // function SetBarSpacing
function SetBarColorDefault($value) {
$this->Debug("Sparkline_Bar :: SetBarColorDefault($value)", DEBUG_SET);
$this->barColorDefault = $value;
} // function SetBarColorDefault
function SetBarColorUnderscoreDefault($value) {
$this->Debug("Sparkline_Bar :: SetBarColorUnderscoreDefault($value)", DEBUG_SET);
$this->barColorUnderscoreDefault = $value;
} // function SetBarColorUnderscoreDefault
////////////////////////////////////////////////////////////////////////////
// data setting
//
function SetData($x, $y, $color = null, $underscore = false, $series = 1) {
if(!is_numeric($x)) {
$x = trim($x);
}
if(!is_numeric($y)) {
$y = trim($y);
}
$this->Debug("Sparkline_Bar :: SetData($x, $y, $series)", DEBUG_SET);
if (!is_numeric($x) ||
!is_numeric($y)) {
$this->Debug("Sparkline_Bar :: SetData rejected values($x, $y) in series $series", DEBUG_WARNING);
return false;
} // if
if ($color == null) {
$color = $this->barColorDefault;
}
$this->dataSeries[$series][$x] = array('value' => $y,
'color' => $color,
'underscore' => $underscore);
if (!isset($this->dataSeriesStats[$series]['min']) ||
$y < $this->dataSeriesStats[$series]['min']) {
$this->dataSeriesStats[$series]['min'] = $y;
}
if (!isset($this->dataSeriesStats[$series]['max']) ||
abs($y) > $this->dataSeriesStats[$series]['max']) {
$this->dataSeriesStats[$series]['max'] = abs($y);
}
} // function SetData
function SetYMin($value) {
$this->Debug("Sparkline_Bar :: SetYMin($value)", DEBUG_SET);
$this->yMin = $value;
}
function SetYMax($value) {
$this->Debug("Sparkline_Bar :: SetYMax($value)", DEBUG_SET);
$this->yMax = $value;
}
function ConvertDataSeries($series, $xBound, $yBound) {
$this->Debug("Sparkline_Bar :: ConvertDataSeries($series, $xBound, $yBound)", DEBUG_CALLS);
if (!isset($this->yMin)) {
$this->yMin = $this->dataSeriesStats[$series]['min'];
}
if (!isset($this->yMax)) {
$this->yMax = $this->dataSeriesStats[$series]['max'];
}
while (list(, $v) = each($this->dataSeries[$series])) {
$y = floor($v['value'] * ($yBound / (abs($this->yMax) + abs($this->yMin))));
$this->dataSeriesConverted[$series][] = array('value' => $y,
'color' => $v['color'],
'underscore' => $v['underscore']);
if (!isset($this->dataSeriesStats[$series]['min_converted']) ||
$y < $this->dataSeriesStats[$series]['min_converted']) {
$this->dataSeriesStats[$series]['min_converted'] = $y;
}
if (!isset($this->dataSeriesStats[$series]['max_converted']) ||
abs($y) > $this->dataSeriesStats[$series]['max_converted']) {
$this->dataSeriesStats[$series]['max_converted'] = abs($y);
}
}
reset($this->dataSeries[$series]);
} // function ConvertDataSeries
function CalculateImageWidth() {
$this->Debug("Sparkline_Bar :: CalculateImageWidth()", DEBUG_CALLS);
$count = sizeof($this->dataSeries[1]);
return (($count - 1) * $this->barSpacing) + ($count * $this->barWidth);
} // function CalculateImageWidth
////////////////////////////////////////////////////////////////////////////
// rendering
//
function Render($y) {
$this->Debug("Sparkline_Bar :: Render($y)", DEBUG_CALLS);
// calculate size based on sets for init
//
if (!parent::Init($this->CalculateImageWidth(), $y)) {
return false;
}
// convert based on actual canvas size
//
$this->ConvertDataSeries(1, $this->GetGraphWidth(), $this->GetGraphHeight());
// stats debugging
//
$this->Debug('Sparkline_Bar :: Draw' .
' series: 1 min: ' . $this->dataSeriesStats[1]['min'] .
' max: ' . $this->dataSeriesStats[1]['max'] .
' height: ' . $this->GetGraphHeight() .
' yfactor: ' . ($this->GetGraphHeight() / (abs($this->dataSeriesStats[1]['max']) + abs($this->dataSeriesStats[1]['min']))));
$this->DrawBackground();
$yAxis = abs(min($this->dataSeriesStats[1]['min_converted'], 0));
for ($i = 0; $i < sizeof($this->dataSeriesConverted[1]); $i++) {
$this->DrawRectangleFilled($i * ($this->barWidth + $this->barSpacing),
$yAxis,
$i * ($this->barWidth + $this->barSpacing) + $this->barWidth - 1,
$yAxis + $this->dataSeriesConverted[1][$i]['value'],
$this->dataSeriesConverted[1][$i]['color']);
if ($this->dataSeriesConverted[1][$i]['underscore']) {
$this->DrawLine(max(0, $i * ($this->barWidth + $this->barSpacing) - ($this->barSpacing / 2)),
$yAxis,
min($this->GetGraphWidth(), $i * ($this->barWidth + $this->barSpacing) + ($this->barSpacing / 2)),
$yAxis,
$this->barColorUnderscoreDefault);
}
}
} // function Render
} // class Sparkline_Bar
?>