Version: 0.8.3
Type: Full Script
Category: Graphics
License: GNU General Public License
Description: Dynamic Graph drawn with SVG and PHP
<?
####################### Development Notes ##############################
/*
Snippet name: svgraphp Version 0.8.3
Developed by:
Jens Pilemand Ottesen
If you do make improvements that can benefit other - please do this:
test your improvement.
share at PHPBuilder.
update the version number in name.
describe you improvements below.
Add your name to the Developer list above.
Development history (add it here when it's all done):
Version 0.8.3: variable variables have been changed to: ${str.$var}
Development in progress (to coordinate development):
######################### Apache configuration ####################################
mime-type file must contain: image/svg+xml svg svgz
You can often find the mime type file here:
"/etc/mime.types" or /etc/httpd/mime.types" or "/etc/http/conf/apache-mime.types"
config-file must containb: AddType application/x-httpd-php .php .php4 .phtml .svg .svgz
found at: "/etc/httpd/httpd.conf"
*/
################################### Variables ################################
$XasMonths = true;
$svgwidth=800;
$svgheight=400;
$graphheight = 300;
$graphwidth = 700;
$margin = 20;
$scaleSize = 125; //Minimum value on Y-axis - use round numbers!
$minScaleCount = 5; //Maximum number of valuespoints on Y-axis
//serie colors
$serieAColor = 'green';
$serieBColor = 'orange';
$serieCColor = 'blue';
$serieDColor = 'purple';
$serieEColor = 'red';
$serieFColor = 'yellow';
$serieGColor = 'navy';
$serieHColor = 'gray';
$serieIColor = 'black';
$serieJColor = 'pink';
############################## Parameter passing ################################
/*
series are defined in the values of serieA=NAME... example:
serieA=redhat
serieB=mandrake
serieC=turbo
the serievalues are then defined like NAME.N=VALUE. Where the first value of N = startDate... example:
startDate=1
endDate=3
redhat1=225
redhat2=325
redhat3=1256
mandrake3=556
store these parameters in a variable like this:
$parameters = "?startMonth=1&endMonth=3&startYear=2002&serieA=redhat&serieB=mandrake";
$parameters .= "&redhat1=333&redhat2=444&mandrake1=0&mandrake2=555&mandrake3=666";
note that empty field should be written as zero
Usually a graph will be embedded in a another webpage. Do it like this:
<EMBED WIDTH="800" HEIGHT="400" SRC="svgraphp.svg<? echo $parameters; ?>" type="image/svg+xml" pluginspage="http://download.adobe.com/pub/adobe/magic/svgviewer/win/3.x/3.0/en/SVGView.exe" wmode="transparent">
############################## Permanent Code #################################
You don't need to alter anything below here.
*/
header("Content-type: image/svg+xml");
print('<?xml version="1.0" encoding="iso-8859-1"?>');
?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg width="<?=$svgwidth;?>px" height="<?=$svgheight;?>px"
xmlns="http://www.w3.org/2000/svg">
<?
$largest = 0;
$stop = false;
for ($a = A; !$stop; $a++){
$thisSerie = ${'serie'.$a};
if (!$thisSerie){ $stop=true; }
else{
for ($m = $startMonth; $m <= $endMonth; $m++){
$thisValue = ${$thisSerie.$m};
if ($thisValue > $largest){ $largest = $thisValue; }
}
}
}
//calculate scale for Y-Axis
$scaleCount = $largest / $scaleSize;
while ($scaleCount > $minScaleCount){
$scaleSize *= 2;
$scaleCount = $largest / $scaleSize;
}
$ySteps = $graphheight / ($scaleCount + 1);
$yPixelFactor = $scaleSize/$ySteps;
//write Y-Axis
for ($i = 0; $i <= $scaleCount + 1 ; $i++ ){
$y = $graphheight - ($i * $ySteps);
echo '<text x="'.$margin.'" y="'.$y.'" style="font-size:15;">'.$i * $scaleSize.'</text>';
echo '<line x1="'.$margin.'" y1="'.$y.'" x2="780" y2="'.$y.'" stroke="gray" />';
}
//write series
$xSteps = $graphwidth / ($endMonth - $startMonth);
$dateYPos = $graphheight + 50;
$legendXPos = $margin;
$legendYPos = $graphheight + 70;
$legendTextYPos = $graphheight + 75;
$stop = false;
for ($a = A; !$stop; $a++){
$thisSerie = ${'serie'.$a};
if (!$thisSerie){ $stop=true; }
else{
//write legend
$legendXPos += 70;
$color = ${'serie'.$a.'Color'};
echo '<rect x="'.$legendXPos.'" y="'.$legendYPos.'" width="8" height="8" fill="'.$color.'" stroke="'.$color.'" />';
$legendXPos += 10;
echo '<text x="'.$legendXPos.'" y="'.$legendTextYPos.'" style="font-size:15;">'.$thisSerie.'</text>';
//write series
$thisX = $margin + 40;
$lastY = 0;
for ($m = $startMonth; $m <= $endMonth; $m++){
$thisValue = ${$thisSerie.$m};
$thisY = $graphheight - ($thisValue/$yPixelFactor);
if ($XasMonths){
$dateX = $thisX - 20;
echo '<text x="'.$dateX.'" y="'.$dateYPos.'" style="font-size:15;">'.date('M-y', mktime(0,0,0,$m,1,$startYear)).'</text>';
}
else{
echo '<text x="'.$thisX.'" y="'.$dateYPos.'" style="font-size:15;">'.$m.'</text>';
}
if ($lastY > 0){
echo '<line x1="'.$lastX.'" y1="'.$lastY.'" x2="'.$thisX.'" y2="'.$thisY.'" stroke-width="2" stroke="'.$color.'" />';
}
$lastY = $thisY;
$lastX = $thisX;
$thisX += $xSteps;
}
}
}
?>
<rect x="1" y="1" width="<? echo $svgwidth-4; ?>" height="<? echo $svgheight-4; ?>" fill="none" stroke="navy" stroke-width="2" />
</svg>