Login   Register  
PHP Classes
elePHPant
Icontem

File: class.hist

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Jesus M. Castagnetto  >  Histogram class  >  class.hist  >  Download  
File: class.hist
Role: ???
Content type: text/plain
Description: Histogram class definition
Class: Histogram class
generate histograms from data set
Author: By
Last change:
Date: 14 years ago
Size: 3,606 bytes
 

Contents

Class file image Download
<?php

/*
 * This is a histogram class that accepts and unidimensional array of data
 * Returns 2 arrays by using the getStats() and getBins() methods.
 * (c) Jesus M. Castagnetto, 1999.
 * Gnu GPL'd code, see www.fsf.org for the details.
 */


class Histogram {

	/* variables */

	var $N,$MIN,$MAX,$AVG,$STDV,$SUM,$SUM2,$NBINS;
	var $BINS = array();
	var $BINGRAPH = array();
	var $STATS = array();

	/* Constructor */

	function Histogram($data="", $nbins=0, $title="") {
		if ($data && $nbins) {
			$this->create($data,$nbins,$title);
		}
	}

	/* Create the histogram */
	
	function create($data,$nbins,$title="") {
		
		/* Check if we got a valid set of data and bins */
		(($this->N = count($data)) > 1) or die("Not enough data, number of values: ".$this->N."\n");
		($this->NBINS = $nbins) > 1 or die("Insuficient number of bins\n");
		
		/* initialize values */
		$this->MIN = (float) min($data);
		$this->MAX = (float) max($data);
		$delta = (float) ($this->MAX - $this->MIN)/$this->NBINS;
		$this->setTitle($title);
		
		/* init bins array */
		for ($i=0; $i < $this->NBINS; $i++) {
			$bin[$i] = (float) $this->MIN + $delta * $i;
			$this->BINS[ (string) $bin[$i] ] = 0;
		}
		
		/* stats */
		for ($i = 0; $i < $this->N ; $i++) {
			$this->SUM += (float) $data[$i];
			$this->SUM2 += (float) pow($data[$i],2);
		}
		$this->AVG = $this->SUM/$this->N;
		$this->STDV = sqrt(($this->SUM2 - $this->N*pow($this->AVG,2))/(float)($this->N - 1));

		/* make the STATS array */
		$this->STATS =	array (
									MIN=>$this->MIN,
									MAX=>$this->MAX,
									N=>$this->N,
									SUM=>$this->SUM,
									SUM2=>$this->SUM2,
									AVG=>$this->AVG,
									STDV=>$this->STDV,
									NBINS=>$this->NBINS
								);

		/* calculate frequencies and populate bins array */
		sort($data);
		$tmp = ($this->NBINS - 1);
		for ($i = 0; $i < $this->N; $i++) {
			for ($j = $tmp; $j >= 0; $j--) {
				if ($data[$i] >= $bin[$j]) {
					$this->BINS[ (string) $bin[$j] ]++;
					break;
				}
			}
		}
	}


	/* sets the Title */
	function setTitle($title) {
		$this->TITLE=$title;
	}

	/* send back STATS array */
	function getStats() {
		return $this->STATS;
	}

	/* send back BINS array */
	function getBins() {
		return $this->BINS;
	}

	/* send back BINS array suitable for plotting with class.graph */
	function getGraphBins() {
		while (list($k,$v) = each($this->BINS)) {
			$bin[] = sprintf("%5.2f",$k); $val[] = $v;
		}
		$bingraph = array($bin,$val);
		return $bingraph;
	}

	/* simple printStats */
	function printStats() {
		$s = "Statistics for histogram: ".$this->TITLE."\n";
		$s .= sprintf("N = %8d\t\tMin = %-8.4f\tMax = %-8.4f\tAvg = %-8.4f\n",$this->N,$this->MIN,$this->MAX,$this->AVG);
		$s .= sprintf("StDev = %-8.4f\tSum = %-8.4f\tSum^2 = %-8.4f\n",$this->STDV,$this->SUM,$this->SUM2);
		echo $s;
	}

	/* simple printBins */
	function printBins() {
		echo "Number of bins: ".count($this->BINS)."\n";
		echo "BIN\tVAL\t\tFREQ\n";
		$maxbin = max($this->BINS);
		reset($this->BINS);
		for ($i = 0; $i < $this->NBINS; $i++) {
			list($key,$val) = each($this->BINS);
			echo sprintf("%d\t%-8.4f\t%-8d |%s\n",$i+1,$key,$val,$this->_printBar($val,$maxbin));
		}
	}

	/* internal function to generate the histogram bars */
	function _printBar($val,$maxbin) {
		$fact = (float) ($maxbin > 40) ? 40/$maxbin : 1;
		$niter = (int) $val * $fact;
		$out = "";
		for ($i=0; $i<$niter; $i++) 
			$out .= "*";
		return $out;
	}

} /* end of Histogram class */

?>