tags:

views:

289

answers:

2

I've created a dynamic pie chart with the GD extension using the image filled arc function. I pass to this script, via HTTP GET variables, up to 11 values. the first value, n, is the number of values that follow. n1,n2,n3, etc. are the data itself. These are integer precentages. The goal is to make a chart that will show the percentages in a pie chart in graphical form.

When I run this as:

piechart.php?n=2&n1=20&n2=80

I only get a black box. Any ideas? Any questions please ask - thanks!

<?php

// var load

$size=500;

//HTTP GET vars:
//N is the number of sections we have
//n1 is the percentage for part1
//n2 is the percentage for part2, and so on

$num=$_GET["n"];
//want to make a hard limit at 10 different sections
$num=min($num,10);
$percents;
$angles;
$angles[0]=0;
$percents[0]=NULL;
//load percents array.  First value is NULL
for ($c=1;$c<=$num;$c++)
{
    $percents[$c]=(int)$_GET["n".$c];
    $angles[$c]=(int)round((($percents[$c-1]+$percents[$c])/100)*360);
}

$angles[$num]=360;

//create image
$half=round($size/2);
$image = imagecreatetruecolor($size, $size);

// colors
$colorR=array(0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x74, 0x33, 0xFF, 0x33, 0x66);
$colorG=array(0x00, 0x80, 0x00, 0xA5, 0xFF, 0xFF, 0x99, 0x00, 0x33, 0xFF);
$colorB=array(0xFF, 0x00, 0x00, 0x00, 0x00, 0xD4, 0xFF, 0x66, 0x99, 0x33);
// shaded colors
$darkColorR=array(0x00, 0x00, 0x80, 0x80, 0x80, 0x3A, 0x1A, 0x80, 0x1A, 0x33);
$darkColorG=array(0x00, 0x40, 0x00, 0x52, 0x80, 0x80, 0x4C, 0x00, 0x1A, 0x80);
$darkColorB=array(0x80, 0x00, 0x00, 0x00, 0x00, 0x6A, 0x80, 0x33, 0x4C, 0x1A);

$white = imagecolorallocate($image, 0xFF, 0xFF, 0xFF);
$black = imagecolorallocate($image, 0x00, 0x00, 0x00);

// make the 3D effect
$tempDarkColor;
for ($i = $half+round(.1*$half); $i > $half; $i--)
{
    for ($j=0;$j<(count($angles)-1)&&$angles[$j]<180;$j++)
    {
     if ($darkColorR[$j]==NULL||$darkColorG[$j]==NULL||$darkColorB[$j]==NULL)
     {
      //if one of the colors is missing, set the entire color to white
      $darkColorR[$j]=0x00;
      $darkColorG[$j]=0x00;
      $darkColorB[$j]=0x00;
     }
     $tempDarkColor[$j]= imagecolorallocate($image, $darkColorR[$j],$darkColorG[$j],$darkColorB[$j]);
     imagefilledarc($image, $half, $i, $size, $half, $angles[$j], $angles[$j+1] , $tempDarkColor[$j], IMG_ARC_PIE);
    }
}
//make the image
$imageColor;
for ($k=0;$k<(count($angles)-1);$k++)
{
    if ($darkColorR[$k]==NULL||$darkColorG[$k]==NULL||$darkColorB[$k]==NULL)
    {
     //if one of the colors is missing, set the entire color to white
     $colorR[$k]=0x00;
     $colorG[$k]=0x00;
     $colorB[$k]=0x00;
    }
    $tempColor[$k]= imagecolorallocate($image, $darkColorR[$k],$darkColorG[$k],$darkColorB[$k]);
    imagefilledarc($image, $half, $half, $size, $half, $angles[$k], $angles[$k+1] , $tempColor[$k], IMG_ARC_PIE);
}

// flush image
header('Content-type: image/png');
imagepng($image);
imagedestroy($image);
?>
A: 

nothing to do with your problem but you might look into the Google Chart API, it would be more easy to create chart with it.

RageZ
Remember, however, that the Google Charts API is quite limited (in functionality and customization options). If you just need to produce a simple, decent looking piechart it is a good option though.
phidah
+2  A: 

This is where it goes wrong:

if ($darkColorR[$j]==NULL||$darkColorG[$j]==NULL||$darkColorB[$j]==NULL)

In PHP you can't compare values to NULL with $var == NULL, you have to use the is_null function:

if (is_null($darkColorR[$j])||is_null($darkColorG[$j])||is_null($darkColorB[$j]))

What this does is get the value of $darkColorR[$i] and check whether it is NULL. I think in your case you are trying to check whether the array has an entry for that specific index, which is something different entirely. You can use the isset function to check if an array has an entry with a given index:

if (!isset($darkColorR[$j])||!isset($darkColorG[$j])||!isset($darkColorB[$j]))

Putting this together gives the following code:

<?php

// var load

$size=500;

//HTTP GET vars:
//N is the number of sections we have
//n1 is the percentage for part1
//n2 is the percentage for part2, and so on

$num=$_GET["n"];
//want to make a hard limit at 10 different sections
$num=min($num,10);
$percents;
$angles;
$angles[0]=0;
$percents[0]=NULL;
//load percents array.  First value is NULL
for ($c=1;$c<=$num;$c++)
{
    $percents[$c]=(int)$_GET["n".$c];
    $angles[$c]=(int)round((($percents[$c-1]+$percents[$c])/100)*360);
}

$angles[$num]=360;

//create image
$half=round($size/2);
$image = imagecreatetruecolor($size, $size);

// colors
$colorR=array(0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x74, 0x33, 0xFF, 0x33, 0x66);
$colorG=array(0x00, 0x80, 0x00, 0xA5, 0xFF, 0xFF, 0x99, 0x00, 0x33, 0xFF);
$colorB=array(0xFF, 0x00, 0x00, 0x00, 0x00, 0xD4, 0xFF, 0x66, 0x99, 0x33);
// shaded colors
$darkColorR=array(0x00, 0x00, 0x80, 0x80, 0x80, 0x3A, 0x1A, 0x80, 0x1A, 0x33);
$darkColorG=array(0x00, 0x40, 0x00, 0x52, 0x80, 0x80, 0x4C, 0x00, 0x1A, 0x80);
$darkColorB=array(0x80, 0x00, 0x00, 0x00, 0x00, 0x6A, 0x80, 0x33, 0x4C, 0x1A);

$white = imagecolorallocate($image, 0xFF, 0xFF, 0xFF);
$black = imagecolorallocate($image, 0x00, 0x00, 0x00);


// make the 3D effect
$tempDarkColor;
for ($i = $half+round(.1*$half); $i > $half; $i--)
{
    for ($j=0;$j<(count($angles)-1)&&$angles[$j]<180;$j++)
    {
        if (!isset($darkColorR[$j])||!isset($darkColorG[$j])||!isset($darkColorB[$j]))
        {
                //if one of the colors is missing, set the entire color to white
                $darkColorR[$j]=0x00;
                $darkColorG[$j]=0x00;
                $darkColorB[$j]=0x00;
        }
        $tempDarkColor[$j]= imagecolorallocate($image, $darkColorR[$j],$darkColorG[$j],$darkColorB[$j]);
        imagefilledarc($image, $half, $i, $size, $half, $angles[$j], $angles[$j+1] , $tempDarkColor[$j], IMG_ARC_PIE);
    }
}

//make the image
for ($k=0;$k<(count($angles)-1);$k++)
{
    if (!isset($colorR[$k])||!isset($colorG[$k])||!isset($colorB[$k]))
    {
        //if one of the colors is missing, set the entire color to white
        $colorR[$k]=0x00;
        $colorG[$k]=0x00;
        $colorB[$k]=0x00;
    }
    $tempColor[$k]= imagecolorallocate($image, $colorR[$k],$colorG[$k],$colorB[$k]);
    imagefilledarc($image, $half, $half, $size, $half, $angles[$k], $angles[$k+1] , $tempColor[$k], IMG_ARC_PIE);
}
// flush image
header('Content-type: image/png');
imagepng($image);
imagedestroy($image);
?>
John