sparkline-php-0.2/0040775014531101426160000000000010247671221013330 5ustar jbyerspg152539sparkline-php-0.2/lib/0040775014531101426160000000000010247671221014076 5ustar jbyerspg152539sparkline-php-0.2/lib/Object.php0100664014531101426160000000754510247671666016042 0ustar jbyerspg152539 * http://sparkline.org * * Sparkline is distributed under a BSD License. See LICENSE for details. * * $Id: Object.php,v 1.8 2005/06/02 21:01:42 jbyers Exp $ * */ define('DEBUG_NONE', 0); // nothing define('DEBUG_ERROR', 1); // major errors define('DEBUG_WARNING', 2); // warnings define('DEBUG_STATS', 4); // dataset, rendering statistics define('DEBUG_CALLS', 8); // major function calls define('DEBUG_SET', 16); // all Set methods define('DEBUG_DRAW', 32); // all Draw methods define('DEBUG_ALL', 2047); // everything function error_handler($errno, $errstr, $errfile, $errline) { switch ($errno) { case E_ERROR: $message = "ERROR: "; break; case E_WARNING: $message = "WARNING: "; break; case E_PARSE: $message = "PARSE: "; break; case E_NOTICE: $message = "NOTICE: "; break; case E_USER_ERROR: $message = "UERROR: "; break; case E_USER_WARNING: $message = "UWARNING: "; break; case E_USER_NOTICE: $message = "UNOTICE: "; break; default: $message = "UNKNOWN: "; break; } // switch $message .= "$errstr in $errfile at line $errline\n"; if (($errno != E_NOTICE) && // suppress notices (error_reporting() != 0)) { // respect supressed errors (@) log_write($message, 'PHP'); } } // function error_handler function log_write($string, $type = '', $date = false) { global $LOGFILE; if (isset($LOGFILE)) { if ($date == false) { $date = time(); } $message = date('d/m/Y:H:i:s', $date) . " $type: $string \n"; error_log($message, 3, $LOGFILE); } } // function log_write class Object { var $isError; var $logFile; var $errorList; var $debugList; var $debugLevel; var $startTime; //////////////////////////////////////////////////////////////////////////// // constructor // function Object($catch_errors = true) { $this->isError = false; $this->logFile = null; $this->logDate = ''; $this->errorList = array(); $this->debugList = array(); $this->debugLevel = DEBUG_NONE; $this->startTime = $this->microTimer(); // if ($catch_errors) { set_error_handler('error_handler'); //} } // function Object //////////////////////////////////////////////////////////////////////////// // utility // function microTimer() { list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } // function microTimer //////////////////////////////////////////////////////////////////////////// // error handling // function SetDebugLevel($level, $file = null) { global $LOGFILE; if ($level >= DEBUG_NONE && $level <= DEBUG_ALL) { $this->debugLevel = $level; } if ($file != null) { if ((!file_exists($file) && !touch($file)) || !is_writable($file)) { die("error log file '$file' is not writable to the web server user"); } else { $this->logFile = $file; $LOGFILE = $file; } } } // function SetDebugLevel function Debug($string, $level = DEBUG_WARNING) { $this->debugList[] = $string; if ($this->debugLevel & $level && $this->logFile != null) { log_write($string, 'DEBUG'); } } // function Debug function Error($string) { $this->isError = true; $this->errorList[] = $string; if ($this->debugLevel & DEBUG_ERROR && $this->logFile != null) { log_write($string, 'ERROR'); } } // function Error function GetDebug() { return $this->debugList; } // function GetDebug function GetError() { return $this->errorList; } // function GetError function IsError() { return $this->isError; } // function IsError } // class Object ?> sparkline-php-0.2/lib/Sparkline.php0100664014531101426160000004172310235506313016537 0ustar jbyerspg152539 * http://sparkline.org * * Sparkline is distributed under a BSD License. See LICENSE for details. * * $Id: Sparkline.php,v 1.8 2005/05/02 20:25:47 jbyers Exp $ * */ define('TEXT_TOP', 1); define('TEXT_RIGHT', 2); define('TEXT_BOTTOM', 3); define('TEXT_LEFT', 4); define('FONT_1', 1); define('FONT_2', 2); define('FONT_3', 3); define('FONT_4', 4); define('FONT_5', 5); require_once('Object.php'); class Sparkline extends Object { var $imageX; var $imageY; var $imageHandle; var $graphAreaPx; var $graphAreaPt; var $colorList; var $colorBackground; var $lineSize; //////////////////////////////////////////////////////////////////////////// // constructor // function Sparkline($catch_errors = true) { parent::Object($catch_errors); $this->colorList = array(); $this->colorBackground = 'white'; $this->lineSize = 1; $this->graphAreaPx = array(array(0, 0), array(0, 0)); // px(L, B), px(R, T) } // function Sparkline //////////////////////////////////////////////////////////////////////////// // init // function Init($x, $y) { $this->Debug("Sparkline :: Init($x, $y)", DEBUG_CALLS); $this->imageX = $x; $this->imageY = $y; // Set functions may have already set graphAreaPx offsets; add image dimensions // $this->graphAreaPx = array(array($this->graphAreaPx[0][0], $this->graphAreaPx[0][1]), array($this->graphAreaPx[1][0] + $x - 1, $this->graphAreaPx[1][1] + $y - 1)); $this->imageHandle = $this->CreateImageHandle($x, $y); // load default colors; set all color handles // $this->SetColorDefaults(); while (list($k, $v) = each($this->colorList)) { $this->SetColorHandle($k, $this->DrawColorAllocate($k, $this->imageHandle)); } reset($this->colorList); if ($this->IsError()) { return false; } else { return true; } } // function Init //////////////////////////////////////////////////////////////////////////// // color, drawing setup functions // function SetColor($name, $r, $g, $b) { $this->Debug("Sparkline :: SetColor('$name', $r, $g, $b)", DEBUG_SET); $name = strtolower($name); $this->colorList[$name] = array('rgb' => array($r, $g, $b)); } // function SetDecColor function SetColorHandle($name, $handle) { $this->Debug("Sparkline :: SetColorHandle('$name', $handle)", DEBUG_SET); $name = strtolower($name); if (array_key_exists($name, $this->colorList)) { $this->colorList[$name]['handle'] = $handle; return true; } else { return false; } } // function SetColorHandle function SetColorHex($name, $r, $g, $b) { $this->Debug("Sparkline :: SetColorHex('$name', $r, $g, $b)", DEBUG_SET); $this->SetColor($name, hexdec($r), hexdec($g), hexdec($b)); } // function SetHexColor function SetColorHtml($name, $rgb) { $this->Debug("Sparkline :: SetColorHtml('$name', '$rgb')", DEBUG_SET); $rgb = trim($rgb, '#'); $this->SetColor($name, hexdec(substr($rgb, 0, 2)), hexdec(substr($rgb, 2, 2)), hexdec(substr($rgb, 4, 2))); } // function SetHexColor function SetColorBackground($name) { $this->Debug("Sparkline :: SetColorBackground('$name')", DEBUG_SET); $this->colorBackground = $name; } // function SetColorBackground function GetColor($name) { if (array_key_exists($name, $this->colorList)) { return $this->colorList[$name]['rgb']; } else { return false; } } // function GetColor function GetColorHandle($name) { $name = strtolower($name); if (array_key_exists($name, $this->colorList)) { return $this->colorList[$name]['handle']; } else { $this->Debug("Sparkline :: GetColorHandle color '$name' not set", DEBUG_WARNING); return false; } } // function GetColorHandle function SetColorDefaults() { $this->Debug("Sparkline :: SetColorDefaults()", DEBUG_SET); $colorDefaults = array(array('aqua', '#00FFFF'), array('black', '#010101'), // TODO failure if 000000? array('blue', '#0000FF'), array('fuscia', '#FF00FF'), array('gray', '#808080'), array('grey', '#808080'), array('green', '#008000'), array('lime', '#00FF00'), array('maroon', '#800000'), array('navy', '#000080'), array('olive', '#808000'), array('purple', '#800080'), array('red', '#FF0000'), array('silver', '#C0C0C0'), array('teal', '#008080'), array('white', '#FFFFFF'), array('yellow', '#FFFF00')); while (list(, $v) = each($colorDefaults)) { if (!array_key_exists($v[0], $this->colorList)) { $this->SetColorHtml($v[0], $v[1]); } } } // function SetColorDefaults function SetLineSize($size) { $this->Debug("Sparkline :: SetLineSize($size)", DEBUG_CALLS); $this->lineSize = $size; } // function SetLineSize function GetLineSize() { return($this->lineSize); } // function GetLineSize function SetPadding($T, $R = null, $B = null, $L = null) { $this->Debug("Sparkline :: SetPadding($T, $R, $B, $L)", DEBUG_CALLS); if (null == $R && null == $B && null == $L) { $this->graphAreaPx = array(array($this->graphAreaPx[0][0] + $T, $this->graphAreaPx[0][1] + $T), array($this->graphAreaPx[1][0] - $T, $this->graphAreaPx[1][1] - $T)); } else { $this->graphAreaPx = array(array($this->graphAreaPx[0][0] + $L, $this->graphAreaPx[0][1] + $B), array($this->graphAreaPx[1][0] - $R, $this->graphAreaPx[1][1] - $T)); } } // function SetPadding //////////////////////////////////////////////////////////////////////////// // canvas setup // function CreateImageHandle($x, $y) { $this->Debug("Sparkline :: CreateImageHandle($x, $y)", DEBUG_CALLS); $handle = @imagecreatetruecolor($x, $y); if (!is_resource($handle)) { $handle = imagecreate($x, $y); $this->Debug('imagecreatetruecolor unavailable', DEBUG_WARNING); } if (!is_resource($handle)) { $this->Debug('imagecreate unavailable', DEBUG_WARNING); $this->Error('could not create image; GD imagecreate functions unavailable'); } return $handle; } // function CreateImageHandle //////////////////////////////////////////////////////////////////////////// // drawing primitives // // NB: all drawing primitives use the coordinate system where (0,0) // corresponds to the bottom left of the image, unlike y-inverted // PHP gd functions // function DrawBackground($handle = false) { $this->Debug("Sparkline :: DrawBackground()", DEBUG_DRAW); if (!$this->IsError()) { if ($handle === false) $handle = $this->imageHandle; return $this->DrawRectangleFilled(0, 0, imagesx($handle) - 1, imagesy($handle) - 1, $this->colorBackground, $handle); } } // function DrawBackground function DrawColorAllocate($color, $handle = false) { $this->Debug("Sparkline :: DrawColorAllocate('$color')", DEBUG_DRAW); if (!$this->IsError() && $colorRGB = $this->GetColor($color)) { if ($handle === false) $handle = $this->imageHandle; return imagecolorallocate($handle, $colorRGB[0], $colorRGB[1], $colorRGB[2]); } } // function DrawColorAllocate function DrawFill($x, $y, $color, $handle = false) { $this->Debug("Sparkline :: DrawFill($x, $y, '$color')", DEBUG_DRAW); if (!$this->IsError() && $colorHandle = $this->GetColorHandle($color)) { if ($handle === false) $handle = $this->imageHandle; return imagefill($handle, $x, $this->TxGDYToSLY($y, $handle), $colorHandle); } } // function DrawFill function DrawLine($x1, $y1, $x2, $y2, $color, $thickness = 1, $handle = false) { $this->Debug("Sparkline :: DrawLine($x1, $y1, $x2, $y2, '$color', $thickness)", DEBUG_DRAW); if (!$this->IsError() && $colorHandle = $this->GetColorHandle($color)) { if ($handle === false) $handle = $this->imageHandle; imagesetthickness($handle, $thickness); $result = imageline($handle, $x1, $this->TxGDYToSLY($y1, $handle), $x2, $this->TxGDYToSLY($y2, $handle), $colorHandle); imagesetthickness($handle, 1); return $result; } } // function DrawLine function DrawPoint($x, $y, $color, $handle = false) { $this->Debug("Sparkline :: DrawPoint($x, $y, '$color')", DEBUG_DRAW); if (!$this->IsError() && $colorHandle = $this->GetColorHandle($color)) { if ($handle === false) $handle = $this->imageHandle; return imagesetpixel($handle, $x, $this->TxGDYToSLY($y, $handle), $colorHandle); } } // function DrawPoint function DrawRectangle($x1, $y1, $x2, $y2, $color, $handle = false) { $this->Debug("Sparkline :: DrawRectangle($x1, $y1, $x2, $y2 '$color')", DEBUG_DRAW); if (!$this->IsError() && $colorHandle = $this->GetColorHandle($color)) { if ($handle === false) $handle = $this->imageHandle; return imagerectangle($handle, $x1, $this->TxGDYToSLY($y1, $handle), $x2, $this->TxGDYToSLY($y2, $handle), $colorHandle); } } // function DrawRectangle function DrawRectangleFilled($x1, $y1, $x2, $y2, $color, $handle = false) { $this->Debug("Sparkline :: DrawRectangleFilled($x1, $y1, $x2, $y2 '$color')", DEBUG_DRAW); if (!$this->IsError() && $colorHandle = $this->GetColorHandle($color)) { // NB: switch y1, y2 post conversion // if ($y1 < $y2) { $yt = $y1; $y1 = $y2; $y2 = $yt; } if ($handle === false) $handle = $this->imageHandle; return imagefilledrectangle($handle, $x1, $this->TxGDYToSLY($y1, $handle), $x2, $this->TxGDYToSLY($y2, $handle), $colorHandle); } } // function DrawRectangleFilled function DrawCircleFilled($x, $y, $diameter, $color, $handle = false) { $this->Debug("Sparkline :: DrawCircleFilled($x, $y, $diameter, '$color')", DEBUG_DRAW); if (!$this->IsError() && $colorHandle = $this->GetColorHandle($color)) { if ($handle === false) $handle = $this->imageHandle; return imagefilledellipse($handle, $x, $this->TxGDYToSLY($y, $handle), $diameter, $diameter, $colorHandle); } } // function DrawCircleFilled function DrawText($string, $x, $y, $color, $font = FONT_1, $handle = false) { $this->Debug("Sparkline :: DrawText('$string', $x, $y, '$color', $font)", DEBUG_DRAW); if (!$this->IsError() && $colorHandle = $this->GetColorHandle($color)) { // adjust for font height so x,y corresponds to bottom left of font // if ($handle === false) $handle = $this->imageHandle; return imagestring($handle, $font, $x, $this->TxGDYToSLY($y + imagefontheight($font), $handle), $string, $colorHandle); } } // function DrawText function DrawTextRelative($string, $x, $y, $color, $position, $padding = 2, $font = FONT_1, $handle = false) { $this->Debug("Sparkline :: DrawTextRelative('$string', $x, $y, '$color', $position, $font, $padding)", DEBUG_DRAW); if (!$this->IsError() && $colorHandle = $this->GetColorHandle($color)) { if ($handle === false) $handle = $this->imageHandle; // rendered text width, height // $textHeight = imagefontheight($font); $textWidth = imagefontwidth($font) * strlen($string); // set (pxX, pxY) based on position and point // switch($position) { case TEXT_TOP: $x = $x - round($textWidth / 2); $y = $y + $padding; break; case TEXT_RIGHT: $x = $x + $padding; $y = $y - round($textHeight / 2); break; case TEXT_BOTTOM: $x = $x - round($textWidth / 2); $y = $y - $padding - $textHeight; break; case TEXT_LEFT: default: $x = $x - $padding - $textWidth; $y = $y - round($textHeight / 2); break; } // truncate bounds based on string size in pixels, image bounds // order: TRBL // $y = min($y, $this->GetImageHeight() - $textHeight); $x = min($x, $this->GetImageWidth() - $textWidth); $y = max($y, 0); $x = max($x, 0); return $this->DrawText($string, $x, $y, $color, $font, $handle); } } // function DrawTextRelative function DrawImageCopyResampled($dhandle, $shandle, $dx, $dy, $sx, $sy, $dw, $dh, $sw, $sh) { $this->Debug("Sparkline :: DrawImageCopyResampled($dhhandle, $shandle, $dx, $dy, $sx, $sy, $dw, $dh, $sw, $sh)", DEBUG_DRAW); if (!$this->IsError()) { return imagecopyresampled($dhandle, // dest handle $shandle, // src handle $dx, $dy, // dest x, y $sx, $sy, // src x, y $dw, $dh, // dest w, h $sw, $sh); // src w, h } } // function DrawImageCopyResampled //////////////////////////////////////////////////////////////////////////// // coordinate system functions // world coordinates are referenced as points or pt // graph coordinates are referenced as pixels or px // sparkline inverts GD Y pixel coordinates; the bottom left of the // image rendering area is px(0,0) // all coordinate transformation functions are prefixed with Tx // all coordinate transformation functions depend on a valid image handle // and will only return valid results after all Set* calls are performed // function TxGDYToSLY($gdY, $handle) { return imagesy($handle) - 1 - $gdY; } // function TxGDYToSLY function TxPxToPt($pxX, $pxY, $handle) { // TODO; must occur after data series conversion } // function TxPxToPt function TxPtToPx($ptX, $ptY, $handle) { // TODO; must occur after data series conversion } // function TxPtToPx function GetGraphWidth() { return $this->graphAreaPx[1][0] - $this->graphAreaPx[0][0]; } // function GetGraphWidth function GetGraphHeight() { return $this->graphAreaPx[1][1] - $this->graphAreaPx[0][1]; } // function GetGraphHeight function GetImageWidth() { return $this->imageX; } // function GetImageWidth function GetImageHeight() { return $this->imageY; } // function GetImageHeight //////////////////////////////////////////////////////////////////////////// // image output // function Output($file = '') { $this->Debug("Sparkline :: Output($file)", DEBUG_CALLS); if ($this->IsError()) { $colorError = imagecolorallocate($this->imageHandle, 0xFF, 0x00, 0x00); imagestring($this->imageHandle, 1, ($this->imageX / 2) - (5 * imagefontwidth(1) / 2), ($this->imageY / 2) - (imagefontheight(1) / 2), "ERROR", $colorError); } if ($file == '') { header('Content-type: image/png'); imagepng($this->imageHandle); } else { imagepng($this->imageHandle, $file); } $this->Debug('Sparkline :: Output - total execution time: ' . round($this->microTimer() - $this->startTime, 4) . ' seconds', DEBUG_STATS); } // function Output function OutputToFile($file) { $this->Output($file); } // function OutputToFile } // class Sparkline ?> sparkline-php-0.2/lib/Sparkline_Bar.php0100664014531101426160000001514010144060514017312 0ustar jbyerspg152539 * http://sparkline.org * * Sparkline is distributed under a BSD License. See LICENSE for details. * * $Id: Sparkline_Bar.php,v 1.2 2004/11/09 06:18:52 jbyers Exp $ * */ require_once('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) { $x = trim($x); $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 ?> sparkline-php-0.2/lib/Sparkline_Line.php0100664014531101426160000002514210167122456017511 0ustar jbyerspg152539 * http://sparkline.org * * Sparkline is distributed under a BSD License. See LICENSE for details. * * $Id: Sparkline_Line.php,v 1.7 2005/01/06 02:40:46 jbyers Exp $ * */ require_once('Sparkline.php'); class Sparkline_Line extends Sparkline { var $dataSeries; var $dataSeriesStats; var $dataSeriesConverted; var $yMin; var $yMax; var $featurePoint; //////////////////////////////////////////////////////////////////////////// // constructor // function Sparkline_Line($catch_errors = true) { parent::Sparkline($catch_errors); $this->dataSeries = array(); $this->dataSeriesStats = array(); $this->dataSeriesConverted = array(); $this->featurePoint = array(); } // function Sparkline //////////////////////////////////////////////////////////////////////////// // data setting // function SetData($x, $y, $series = 1) { $x = trim($x); $y = trim($y); $this->Debug("Sparkline_Line :: SetData($x, $y, $series)", DEBUG_SET); if (!is_numeric($x) || !is_numeric($y)) { $this->Debug("Sparkline_Line :: SetData rejected values($x, $y) in series $series", DEBUG_WARNING); return false; } // if $this->dataSeries[$series][$x] = $y; if (!isset($this->dataSeriesStats[$series]['yMin']) || $y < $this->dataSeriesStats[$series]['yMin']) { $this->dataSeriesStats[$series]['yMin'] = $y; } if (!isset($this->dataSeriesStats[$series]['xMin']) || $x < $this->dataSeriesStats[$series]['xMin']) { $this->dataSeriesStats[$series]['xMin'] = $x; } if (!isset($this->dataSeriesStats[$series]['yMax']) || $y > $this->dataSeriesStats[$series]['yMax']) { $this->dataSeriesStats[$series]['yMax'] = $y; } if (!isset($this->dataSeriesStats[$series]['xMax']) || $x > $this->dataSeriesStats[$series]['xMax']) { $this->dataSeriesStats[$series]['xMax'] = $x; } } // function SetData function SetYMin($value) { $this->Debug("Sparkline_Line :: SetYMin($value)", DEBUG_SET); $this->yMin = $value; } // function SetYMin function SetYMax($value) { $this->Debug("Sparkline_Line :: SetYMax($value)", DEBUG_SET); $this->yMax = $value; } // function SetYMin function ConvertDataSeries($series, $xBound, $yBound) { $this->Debug("Sparkline_Line :: ConvertDataSeries($series, $xBound, $yBound)", DEBUG_CALLS); if (!isset($this->yMin)) { $this->yMin = $this->dataSeriesStats[$series]['yMin']; } if (!isset($this->yMin)) { $this->xMin = $this->dataSeriesStats[$series]['XMin']; } if (!isset($this->yMax)) { $this->yMax = $this->dataSeriesStats[$series]['yMax'] + ($this->yMin * -1); } if (!isset($this->xMax)) { $this->xMax = $this->dataSeriesStats[$series]['xMax']; } for ($i = 0; $i < sizeof($this->dataSeries[$series]); $i ++) { $y = round(($this->dataSeries[$series][$i] + ($this->yMin * -1)) * ($yBound / $this->yMax)); $x = round($i * $xBound / sizeof($this->dataSeries[$series])); $this->dataSeriesConverted[$series][] = array($x, $y); $this->Debug("Sparkline :: ConvertDataSeries series $series value $i ($x, $y)", DEBUG_SET); } } // function ConvertDataSeries //////////////////////////////////////////////////////////////////////////// // features // function SetFeaturePoint($x, $y, $color, $diameter, $text = '', $position = TEXT_TOP, $font = FONT_1) { $this->Debug("Sparkline_Line :: SetFeaturePoint($x, $y, '$color', $diameter, '$text')", DEBUG_CALLS); $this->featurePoint[] = array('ptX' => $x, 'ptY' => $y, 'color' => $color, 'diameter' => $diameter, 'text' => $text, 'textpos' => $position, 'font' => $font); } // function SetFeaturePoint //////////////////////////////////////////////////////////////////////////// // low quality rendering // function Render($x, $y) { $this->Debug("Sparkline_Line :: Render($x, $y)", DEBUG_CALLS); if (!parent::Init($x, $y)) { return false; } // convert based on graphAreaPx bounds // $this->ConvertDataSeries(1, $this->GetGraphWidth(), $this->GetGraphHeight()); // stats debugging // $this->Debug('Sparkline_Line :: Draw' . ' series: 1 min: ' . $this->dataSeriesStats[1]['yMin'] . ' max: ' . $this->dataSeriesStats[1]['yMax'] . ' offset: ' . ($this->dataSeriesStats[1]['yMin'] * -1) . ' height: ' . $this->GetGraphHeight() + 1 . ' yfactor: ' . ($this->GetGraphHeight() / ($this->dataSeriesStats[1]['yMax'] + ($this->dataSeriesStats[1]['yMin'] * -1)))); $this->Debug('Sparkline_Line :: Draw' . ' drawing area:' . ' (' . $this->graphAreaPx[0][0] . ',' . $this->graphAreaPx[0][1] . '), ' . ' (' . $this->graphAreaPx[1][0] . ',' . $this->graphAreaPx[1][1] . ')'); $this->DrawBackground(); // draw graph // for ($i = 0; $i < sizeof($this->dataSeriesConverted[1]) - 1; $i++) { $this->DrawLine($this->dataSeriesConverted[1][$i][0] + $this->graphAreaPx[0][0], $this->dataSeriesConverted[1][$i][1] + $this->graphAreaPx[0][1], $this->dataSeriesConverted[1][$i+1][0] + $this->graphAreaPx[0][0], $this->dataSeriesConverted[1][$i+1][1] + $this->graphAreaPx[0][1], 'black'); } // draw features // while (list(, $v) = each($this->featurePoint)) { $pxY = round(($v['ptY'] + ($this->yMin * -1)) * ($this->GetGraphHeight() / $this->yMax)); $pxX = round($v['ptX'] * $this->GetGraphWidth() / $this->dataSeriesStats[1]['xMax']); $this->DrawCircleFilled($pxX + $this->graphAreaPx[0][0], $pxY + $this->graphAreaPx[0][1], $v['diameter'], $v['color'], $this->imageHandle); $this->DrawTextRelative($v['text'], $pxX + $this->graphAreaPx[0][0], $pxY + $this->graphAreaPx[0][1], $v['color'], $v['textpos'], round($v['diameter'] / 2), $v['font'], $this->imageHandle); } } // function Render //////////////////////////////////////////////////////////////////////////// // high quality rendering // function RenderResampled($x, $y) { $this->Debug("Sparkline_Line :: RenderResampled($x, $y)", DEBUG_CALLS); if (!parent::Init($x, $y)) { return false; } // draw background on standard image in case of resample blit miss // $this->DrawBackground($this->imageHandle); // convert based on virtual canvas: x based on size of dataset, y scaled proportionately // if size of data set is small, default to 4X target canvas size // $xVC = max(sizeof($this->dataSeries[1]), 4 * $x); $yVC = floor($xVC * ($this->GetGraphHeight() / $this->GetGraphWidth())); $this->ConvertDataSeries(1, $xVC, $yVC); // stats debugging // $this->Debug('Sparkline_Line :: DrawResampled' . ' series: 1 min: ' . $this->dataSeriesStats[1]['yMin'] . ' max: ' . $this->dataSeriesStats[1]['yMax'] . ' offset: ' . ($this->dataSeriesStats[1]['yMin'] * -1) . ' height: ' . $this->GetGraphHeight() . ' yfactor: ' . ($this->GetGraphHeight() / ($this->dataSeriesStats[1]['yMax'] + ($this->dataSeriesStats[1]['yMin'] * -1))), DEBUG_STATS); $this->Debug('Sparkline_Line :: DrawResampled' . ' drawing area:' . ' (' . $this->graphAreaPx[0][0] . ',' . $this->graphAreaPx[0][1] . '), ' . ' (' . $this->graphAreaPx[1][0] . ',' . $this->graphAreaPx[1][1] . ')'); // create virtual image // allocate colors // draw background, graph // resample and blit onto original graph // $imageVCHandle = $this->CreateImageHandle($xVC, $yVC); while (list($k, $v) = each($this->colorList)) { $this->SetColorHandle($k, $this->DrawColorAllocate($k, $imageVCHandle)); } reset($this->colorList); $this->DrawBackground($imageVCHandle); for ($i = 0; $i < sizeof($this->dataSeriesConverted[1]) - 1; $i++) { $this->DrawLine($this->dataSeriesConverted[1][$i][0], $this->dataSeriesConverted[1][$i][1], $this->dataSeriesConverted[1][$i+1][0], $this->dataSeriesConverted[1][$i+1][1], 'black', $this->GetLineSize(), $imageVCHandle); } $this->DrawImageCopyResampled($this->imageHandle, $imageVCHandle, $this->graphAreaPx[0][0], // dest x $this->GetImageHeight() - $this->graphAreaPx[1][1], // dest y 0, 0, // src x, y $this->GetGraphWidth(), // dest width $this->GetGraphHeight(), // dest height $xVC, // src width $yVC); // src height // draw features // while (list(, $v) = each($this->featurePoint)) { $pxY = round(($v['ptY'] + ($this->yMin * -1)) * ($this->GetGraphHeight() / $this->yMax)); $pxX = round($v['ptX'] * $this->GetGraphWidth() / $this->dataSeriesStats[1]['xMax']); $this->DrawCircleFilled($pxX + $this->graphAreaPx[0][0], $pxY + $this->graphAreaPx[0][1], $v['diameter'], $v['color'], $this->imageHandle); $this->DrawTextRelative($v['text'], $pxX + $this->graphAreaPx[0][0], $pxY + $this->graphAreaPx[0][1], $v['color'], $v['textpos'], round($v['diameter'] / 2), $v['font'], $this->imageHandle); } } // function RenderResampled } // class Sparkline_Line ?> sparkline-php-0.2/.cvsignore0100664014531101426160000000001010143627017015313 0ustar jbyerspg152539log.txt sparkline-php-0.2/CHANGES0100664014531101426160000000117710247671317014334 0ustar jbyerspg152539# # Sparkline PHP Graphing Library # Copyright 2004 James Byers # http://sparkline.org # # Sparkline is distributed under a BSD License. See LICENSE for details. # # $Id: CHANGES,v 1.2 2005/06/02 20:57:51 jbyers Exp $ # 2005-06-02 James Byers * Version 0.2 released * Corrected line chart behavior for small data sets [1096890] * Library will create log file if possible [1163412] * Fixed error message on bad log file [1096895] * Corrected bitmask on DEBUG_ALL * Revised structure of SetFeature 2004-11-08 James Byers * Version 0.1 released sparkline-php-0.2/DESIGN0100664014531101426160000000117710144066562014231 0ustar jbyerspg152539# # Sparkline PHP Graphing Library # Copyright 2004 James Byers # http://sparkline.org # # Sparkline is distributed under a BSD License. See LICENSE for details. # # $Id: DESIGN,v 1.3 2004/11/09 07:10:42 jbyers Exp $ # Not much to see. It's 0.1, after all. Flow ------------------------------------------------------------------------------ Instantiate appropriate Sparkline subclass Load data, set parameters, all Set* calls Render convert coordinates calculate image size create image handle set colors fill background draw graph draw features Optionally call Draw* functions Output / OutputFile sparkline-php-0.2/LICENSE0100664014531101426160000000274410143625734014344 0ustar jbyerspg152539Copyright (c) 2004 James Byers All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of James Byers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. sparkline-php-0.2/README0100664014531101426160000000152110144066562014206 0ustar jbyerspg152539# # Sparkline PHP Graphing Library # Copyright 2004 James Byers # http://sparkline.org # # Sparkline is distributed under a BSD License. See LICENSE for details. # # $Id: README,v 1.2 2004/11/09 07:10:42 jbyers Exp $ # Installation: ------------- Sparkline does not have any installation requirements. See the samples directory for usage ideas. Requirements: ------------- Sparkline requires PHP 4.0.6 or newer and GD 2.0 built as a PHP module. Troubleshooting and Support: ---------------------------- See http://sparkline.org for troubleshooting advice and support. Bugs, Features: --------------- Please submit bugs to the bug tracker: http://sourceforge.net/tracker/?group_id=122936&atid=694962 Please submit feature requests to the RFE tracker: http://sourceforge.net/tracker/?group_id=122936&atid=694965 sparkline-php-0.2/samples/0040775014531101426160000000000010247671221014774 5ustar jbyerspg152539sparkline-php-0.2/samples/baseball.php0100664014531101426160000000534010145453551017252 0ustar jbyerspg152539 * http://sparkline.org * * Sparkline is distributed under a BSD License. See LICENSE for details. * * $Id: baseball.php,v 1.8 2004/11/13 18:50:17 jbyers Exp $ * * baseball shows a simple whisker graph of two very different postseasons * * parameters: t team [yankees|redsox] * */ // win/loss, home, shutout // 2004 postseason, source MLB.com // if anyone has full season data in a workable format, please let me know // - jbyers@users.sf.net // $data['yankees'] = array(0 => array(0, 1, 1), 1 => array(1, 1, 0), 2 => array(1, 0, 0), 3 => array(1, 0, 0), 4 => array(1, 1, 0), 5 => array(1, 1, 0), 6 => array(1, 0, 0), 7 => array(0, 0, 0), 8 => array(0, 0, 0), 9 => array(0, 1, 0), 10 => array(0, 1, 0)); $data['redsox'] = array(0 => array(1, 0, 0), 1 => array(1, 0, 0), 2 => array(1, 1, 0), 3 => array(0, 0, 0), 4 => array(0, 0, 0), 5 => array(0, 1, 0), 6 => array(1, 1, 0), 7 => array(1, 1, 0), 8 => array(1, 0, 0), 9 => array(1, 0, 0), 10 => array(1, 1, 0), 11 => array(1, 1, 0), 12 => array(1, 0, 0), 13 => array(1, 0, 1)); if (!isset($_GET['t']) || ($_GET['t'] != 'yankees' && $_GET['t'] != 'redsox')) { die('bad team name; need ?t=yankees or ?t=redsox'); } ////////////////////////////////////////////////////////////////////////////// // build sparkline using standard flow: // construct, set, render, output // require_once('../lib/Sparkline_Bar.php'); $sparkline = new Sparkline_Bar(); $sparkline->SetDebugLevel(DEBUG_NONE); //$sparkline->SetDebugLevel(DEBUG_ERROR | DEBUG_WARNING | DEBUG_STATS | DEBUG_CALLS, '../log.txt'); $sparkline->SetBarWidth(1); $sparkline->SetBarSpacing(2); $i = 0; while (list(, $v) = each($data[$_GET['t']])) { // set bar color red if shutout // $color = 'black'; if ($v[2]) { $color = 'red'; } // set bar underscore boolean if home game // $underscore = false; if ($v[1]) { $underscore = true; } // convert (W, L) to (1, -1) // $sparkline->SetData($i, ($v[0] * 2) - 1, $color, $underscore); $i++; } $sparkline->Render(16); // height only for Sparkline_Bar $sparkline->Output(); ?> sparkline-php-0.2/samples/deficit.php0100664014531101426160000000342710144066075017120 0ustar jbyerspg152539 * http://sparkline.org * * Sparkline is distributed under a BSD License. See LICENSE for details. * * $Id: deficit.php,v 1.2 2004/11/09 07:05:33 jbyers Exp $ * * deficit shows a bar graph of the US deficit * */ // annual deficit data, 1983-2003 // source OMB, http://www.whitehouse.gov/omb/budget/fy2004/hist.html // $data = array(1983 => -207.802, 1984 => -185.367, 1985 => -212.308, 1986 => -221.215, 1987 => -149.728, 1988 => -155.152, 1989 => -152.456, 1990 => -221.195, 1991 => -269.328, 1992 => -290.376, 1993 => -255.087, 1994 => -203.250, 1995 => -163.972, 1996 => -107.473, 1997 => -21.958, 1998 => 69.213, 1999 => 125.563, 2000 => 236.445, 2001 => 127.299, 2002 => -157.802, 2003 => -304.159); ////////////////////////////////////////////////////////////////////////////// // build sparkline using standard flow: // construct, set, render, output // require_once('../lib/Sparkline_Bar.php'); $sparkline = new Sparkline_Bar(); $sparkline->SetDebugLevel(DEBUG_NONE); //$sparkline->SetDebugLevel(DEBUG_ERROR | DEBUG_WARNING | DEBUG_STATS | DEBUG_CALLS, '../log.txt'); $sparkline->SetBarWidth(2); $sparkline->SetBarSpacing(1); while (list($k, $v) = each($data)) { // black if positive, red if negative // $color = 'black'; if ($v < 0) { $color = 'red'; } $sparkline->SetData($k, $v, $color); } $sparkline->Render(16); // height only for Sparkline_Bar $sparkline->Output(); ?> sparkline-php-0.2/samples/filled.php0100664014531101426160000000353010247671560016750 0ustar jbyerspg152539 * http://sparkline.org * * Sparkline is distributed under a BSD License. See LICENSE for details. * * $Id: filled.php,v 1.2 2005/06/02 21:00:32 jbyers Exp $ * * filled shows deficit data in a simulated filled-line mode * */ // annual deficit data, 1983-2003 // source OMB, http://www.whitehouse.gov/omb/budget/fy2004/hist.html // $data = array(1983 => -207.802, 1984 => -185.367, 1985 => -212.308, 1986 => -221.215, 1987 => -149.728, 1988 => -155.152, 1989 => -152.456, 1990 => -221.195, 1991 => -269.328, 1992 => -290.376, 1993 => -255.087, 1994 => -203.250, 1995 => -163.972, 1996 => -107.473, 1997 => -21.958, 1998 => 69.213, 1999 => 125.563, 2000 => 236.445, 2001 => 127.299, 2002 => -157.802, 2003 => -304.159); ////////////////////////////////////////////////////////////////////////////// // build sparkline using standard flow: // construct, set, render, output // require_once('../lib/Sparkline_Bar.php'); $sparkline = new Sparkline_Bar(); $sparkline->SetDebugLevel(DEBUG_NONE); //$sparkline->SetDebugLevel(DEBUG_ERROR | DEBUG_WARNING | DEBUG_STATS | DEBUG_CALLS, '../log.txt'); $sparkline->SetBarWidth(1); $sparkline->SetBarSpacing(0); $sparkline->SetBarColorDefault('blue'); $j = 0; for($i = 1983; $i < sizeof($data) + 1983; $i++) { $sparkline->SetData($j++, $data[$i]); if (isset($data[$i+1])) { $sparkline->SetData($j++, ($data[$i] + $data[$i+1]) / 2); } } $sparkline->Render(10); // height only for Sparkline_Bar $sparkline->Output(); ?> sparkline-php-0.2/samples/primitives.php0100664014531101426160000000213410144066075017676 0ustar jbyerspg152539 * http://sparkline.org * * Sparkline is distributed under a BSD License. See LICENSE for details. * * $Id: primitives.php,v 1.5 2004/11/09 07:05:33 jbyers Exp $ * * primitives doesn't draw a sparkline, only exercises the drawing primitives * */ require_once('../lib/Sparkline.php'); $sparkline = new Sparkline(); $sparkline->SetDebugLevel(DEBUG_NONE); //$sparkline->SetDebugLevel(DEBUG_ERROR | DEBUG_WARNING | DEBUG_STATS | DEBUG_CALLS, '../log.txt'); // with any Sparkline subclass, Render would be called instead of Init // $sparkline->Init(100, 20); $sparkline->DrawFill(9, 9, 'white'); $sparkline->DrawRectangleFilled(1, 9, 98, 18, 'grey'); $sparkline->DrawLine(0, 0, 19, 19, 'red'); $sparkline->DrawCircleFilled(49, 9, 10, 'black'); $sparkline->DrawPoint(96, 17, 'black'); $sparkline->DrawRectangle(0, 0, 99, 19, 'blue'); $sparkline->DrawText('test1', 0, 0, 'red', 1); $sparkline->DrawText('test2', 25, 0, 'olive', 2); $sparkline->DrawText('test3', 50, 0, 'blue', 3); $sparkline->Output(); ?> sparkline-php-0.2/samples/stock_chart.php0100664014531101426160000000516010144242620020001 0ustar jbyerspg152539 * http://sparkline.org * * Sparkline is distributed under a BSD License. See LICENSE for details. * * $Id: stock_chart.php,v 1.9 2004/11/09 22:32:48 jbyers Exp $ * * stock_chart displays an N-year stock chart sparkline based on Yahoo! data * each data point is the day's closing price * * http://ichart.finance.yahoo.com/table.csv?s=MSFT&a=11&b=31&c=1998&d=11&e=31&f=1999&g=d&ignore=.csv * NB: months are zero-based, any error will cause a 404 * * parameters: s ticker symbol * y number of years [1-5] * m drawing mode, 1 for pretty * */ ////////////////////////////////////////////////////////////////////////////// // verify parameters; bad form, but die to text error on failure // if (!isset($_GET['s']) || !eregi('^[a-z\^]{1,5}$', $_GET['s'])) { die('bad ticker ' . $_GET['s']); } if (!isset($_GET['y']) || !is_numeric($_GET['y']) || $_GET['y'] > 5 || $_GET['y'] < 0) { die('bad year ' . $_GET['y']); } ////////////////////////////////////////////////////////////////////////////// // load and process data from Yahoo! ichart csv source // $m = date('n') - 1; $d = date('d'); $y2 = date('Y'); $y1 = $y2 - $_GET['y']; // data sample: // 0 1 2 3 4 5 6 // Date,Open,High,Low,Close,Volume,Adj. Close* // 5-Nov-04,29.21,29.36,29.03,29.31,95337696,29.31 // $url = "http://ichart.finance.yahoo.com/table.csv?s=" . $_GET['s'] . "&a=$m&b=$d&c=$y1&d=$m&e=$d&f=$y2&g=d&ignore=.csv"; if (!$data = @file($url)) { die('error fetching stock data; verify ticker symbol'); } ////////////////////////////////////////////////////////////////////////////// // build sparkline using standard flow: // construct, set, render, output // require_once('../lib/Sparkline_Line.php'); $sparkline = new Sparkline_Line(); $sparkline->SetDebugLevel(DEBUG_NONE); //$sparkline->SetDebugLevel(DEBUG_ERROR | DEBUG_WARNING | DEBUG_STATS | DEBUG_CALLS, '../log.txt'); if (isset($_GET['b'])) { $sparkline->SetColorHtml('background', $_GET['b']); $sparkline->SetColorBackground('background'); } $data = array_reverse($data); $i = 0; while (list(, $v) = each($data)) { $elements = explode(',', $v); if (ereg('^[0-9\.]+$', trim($elements[6]))) { $sparkline->SetData($i, $elements[6]); $i++; } } $sparkline->SetYMin(0); if (isset($_GET['m']) && $_GET['m'] == '0') { $sparkline->Render(100, 15); } else { $sparkline->SetLineSize(6); // for renderresampled, linesize is on virtual image $sparkline->RenderResampled(100, 15); } $sparkline->Output(); ?> sparkline-php-0.2/samples/stock_chart2.php0100664014531101426160000000710410147316663020077 0ustar jbyerspg152539 * http://sparkline.org * * Sparkline is distributed under a BSD License. See LICENSE for details. * * $Id: stock_chart2.php,v 1.2 2004/11/19 07:16:03 jbyers Exp $ * * stock_chart2 adds min/max price bounds and an endpoint value label to * stock_chart * * layout inspired by Mariano Belinky's SVG sparklines: * http://www.interactiva.com.ar/mariano/?pname=sparklines * */ ////////////////////////////////////////////////////////////////////////////// // verify parameters; bad form, but die to text error on failure // if (!isset($_GET['s']) || !eregi('^[a-z\^]{1,5}$', $_GET['s'])) { die('bad ticker ' . $_GET['s']); } if (!isset($_GET['y']) || !is_numeric($_GET['y']) || $_GET['y'] > 5 || $_GET['y'] < 0) { die('bad year ' . $_GET['y']); } ////////////////////////////////////////////////////////////////////////////// // load and process data from Yahoo! ichart csv source // $m = date('n') - 1; $d = date('d'); $y2 = date('Y'); $y1 = $y2 - $_GET['y']; // data sample: // 0 1 2 3 4 5 6 // Date,Open,High,Low,Close,Volume,Adj. Close* // 5-Nov-04,29.21,29.36,29.03,29.31,95337696,29.31 // $url = "http://ichart.finance.yahoo.com/table.csv?s=" . $_GET['s'] . "&a=$m&b=$d&c=$y1&d=$m&e=$d&f=$y2&g=d&ignore=.csv"; if (!$data = @file($url)) { die('error fetching stock data; verify ticker symbol'); } ////////////////////////////////////////////////////////////////////////////// // build sparkline using standard flow: // construct, set, render, output // require_once('../lib/Sparkline_Line.php'); $sparkline = new Sparkline_Line(); $sparkline->SetDebugLevel(DEBUG_NONE); //$sparkline->SetDebugLevel(DEBUG_ERROR | DEBUG_WARNING | DEBUG_STATS | DEBUG_CALLS, '../log.txt'); if (isset($_GET['b'])) { $sparkline->SetColorHtml('background', $_GET['b']); $sparkline->SetColorBackground('background'); } $data = array_reverse($data); $i = 0; $min = null; $max = null; $last = null; while (list(, $v) = each($data)) { $elements = explode(',', $v); $value = @trim($elements[6]); if (ereg('^[0-9\.]+$', $value)) { $sparkline->SetData($i, $value); if (null == $max || $value >= $max[1]) { $max = array($i, $value); } if (null == $min || $value <= $min[1]) { $min = array($i, $value); } $last = array($i, $value); $i++; } } // set y-bound, min and max extent lines // $sparkline->SetYMin(0); $sparkline->SetPadding(2); // setpadding is additive $sparkline->SetPadding(imagefontheight(FONT_2), imagefontwidth(FONT_2) * strlen(" $last[1]"), 0, //imagefontheight(FONT_2), 0); $sparkline->SetFeaturePoint($min[0], $min[1], 'red', 5, $min[1], TEXT_TOP, FONT_2); $sparkline->SetFeaturePoint($max[0], $max[1], 'green', 5, $max[1], TEXT_TOP, FONT_2); $sparkline->SetFeaturePoint($last[0], $last[1], 'blue', 5, " $last[1]", TEXT_RIGHT, FONT_2); if (isset($_GET['m']) && $_GET['m'] == '0') { $sparkline->Render(200, 50); } else { $sparkline->SetLineSize(3); // for renderresampled, linesize is on virtual image $sparkline->RenderResampled(200, 50); } // manually add a stock ticker label // $sparkline->DrawText(strtoupper($_GET['s']), $sparkline->GetImageWidth() - (imagefontwidth(FONT_5) * strlen($_GET['s'])), $sparkline->GetImageHeight() - imagefontheight(FONT_5), 'black', FONT_5); $sparkline->Output(); ?> sparkline-php-0.2/samples/stock_chart3.php0100664014531101426160000000563610146317573020110 0ustar jbyerspg152539 * http://sparkline.org * * Sparkline is distributed under a BSD License. See LICENSE for details. * * $Id: stock_chart3.php,v 1.1 2004/11/16 06:34:35 jbyers Exp $ * * stock_chart3 adds min/max price bounds and an endpoint value label to * stock_chart, but without text as in stock_chart2 * */ ////////////////////////////////////////////////////////////////////////////// // verify parameters; bad form, but die to text error on failure // if (!isset($_GET['s']) || !eregi('^[a-z\^]{1,5}$', $_GET['s'])) { die('bad ticker ' . $_GET['s']); } if (!isset($_GET['y']) || !is_numeric($_GET['y']) || $_GET['y'] > 5 || $_GET['y'] < 0) { die('bad year ' . $_GET['y']); } ////////////////////////////////////////////////////////////////////////////// // load and process data from Yahoo! ichart csv source // $m = date('n') - 1; $d = date('d'); $y2 = date('Y'); $y1 = $y2 - $_GET['y']; // data sample: // 0 1 2 3 4 5 6 // Date,Open,High,Low,Close,Volume,Adj. Close* // 5-Nov-04,29.21,29.36,29.03,29.31,95337696,29.31 // $url = "http://ichart.finance.yahoo.com/table.csv?s=" . $_GET['s'] . "&a=$m&b=$d&c=$y1&d=$m&e=$d&f=$y2&g=d&ignore=.csv"; if (!$data = @file($url)) { die('error fetching stock data; verify ticker symbol'); } ////////////////////////////////////////////////////////////////////////////// // build sparkline using standard flow: // construct, set, render, output // require_once('../lib/Sparkline_Line.php'); $sparkline = new Sparkline_Line(); $sparkline->SetDebugLevel(DEBUG_NONE); //$sparkline->SetDebugLevel(DEBUG_ERROR | DEBUG_WARNING | DEBUG_STATS | DEBUG_CALLS, '../log.txt'); if (isset($_GET['b'])) { $sparkline->SetColorHtml('background', $_GET['b']); $sparkline->SetColorBackground('background'); } $data = array_reverse($data); $i = 0; $min = null; $max = null; $last = null; while (list(, $v) = each($data)) { $elements = explode(',', $v); $value = @trim($elements[6]); if (ereg('^[0-9\.]+$', $value)) { $sparkline->SetData($i, $value); if (null == $max || $value >= $max[1]) { $max = array($i, $value); } if (null == $min || $value <= $min[1]) { $min = array($i, $value); } $last = array($i, $value); $i++; } } // set y-bound, min and max extent lines // $sparkline->SetYMin(0); $sparkline->SetPadding(3); $sparkline->SetColorHtml('ltgreen', '#00CC00'); $sparkline->SetFeaturePoint($min[0], $min[1], 'red', 3); $sparkline->SetFeaturePoint($max[0], $max[1], 'ltgreen', 3); $sparkline->SetFeaturePoint($last[0], $last[1], 'blue', 3); if (isset($_GET['m']) && $_GET['m'] == '0') { $sparkline->Render(80, 20); } else { $sparkline->SetLineSize(5); // for renderresampled, linesize is on virtual image $sparkline->RenderResampled(80, 20); } $sparkline->Output(); ?>