用PHP绘制图形

时间:2011-01-12 05:44:07

标签: php dynamic graph

我使用PHP从数组生成图形。我希望在同一页面上创建多个图形,因为我需要根据从数据库中提取的答案设计摘要报告。 目前我正在使用此代码,我只能获得一个图表。为了获得多个图,我需要对代码添加什么内容?

<?php
    function draw_graph($values)
    {
        // Get the total number of columns we are going to plot
        $columns  = count($values);

        // Get the height and width of the final image
        $width = 300;
        $height = 200;

        // Set the amount of space between each column
        $padding = 5;

        // Get the width of 1 column
        $column_width = $width / $columns ;

        // Generate the image variables

        $im        = imagecreate($width,$height);
        $gray      = imagecolorallocate ($im,0xcc,0xcc,0xcc);
        $gray_lite = imagecolorallocate ($im,0xee,0xee,0xee);
        $gray_dark = imagecolorallocate ($im,0x7f,0x7f,0x7f);
        $white     = imagecolorallocate ($im,0xff,0xff,0xff);

        // Fill in the background of the image
        imagefilledrectangle($im,0,0,$width,$height,$white);
        $maxv = 0;

        // Calculate the maximum value we are going to plot
        for($i=0;$i<$columns;$i++)$maxv = max($values[$i],$maxv);

        // Now plot each column
        for($i=0;$i<$columns;$i++)
        {
            $column_height = ($height / 100) * (( $values[$i] / $maxv) *100);
            $x1 = $i*$column_width;
            $y1 = $height-$column_height;
            $x2 = (($i+1)*$column_width)-$padding;
            $y2 = $height;
            imagefilledrectangle($im,$x1,$y1,$x2,$y2,$gray_dark);
        }

        header ("Content-type: image/png");
        imagepng($im);
        imagedestroy($im);
    }

    $values = array("23","32","35","57","12");
    $values2 = array("123","232","335","157","102");
    draw_graph($values2);
    draw_graph($values);//no output is coming
    draw_graph($values2);//no output is coming
    draw_graph($values);//no output is coming
?>

5 个答案:

答案 0 :(得分:3)

我不是GD专家,所以我更喜欢使用Google Chart Tools API。它节省了大量的PHP图形制作噩梦,并提供了一组很好的功能来提供,格式化和样式化数据。

如果你想坚持你的代码那也没关系。我将从显而易见的开始:是否启用了GD?如果是,那么您的问题是尝试在一个页面上导出多个图像。删除除draw_graph之外的所有调用,看看你得到了什么样的输出。

<?php
function combine_graphs( $graph_values ) {
    $Yoffset = 0;
    $image = imagecreate( 300, 200 * count( $graph_values ) );

    foreach( $graph_values as $values ) {
        draw_graph( $values, $image, $Yoffset ); //Be sure to add y offsets and not call imagepng() in here
        $Yoffset += 200;
    }

    //Let the master function output the image
    header ("Content-type: image/png");    
    imagepng($im);  
    imagedestroy($im);
}

//Usage
combine_graphs( array( $dataForGraph1, $dataForGraph2, $dataForGraph3 ) );
?>

答案 1 :(得分:2)

您的输出是使用header进行的,因此您无法输出两次(允许输出后无标题)。 您应该看一下绘图实用程序(例如Google charts),或者使用php脚本绘制请求参数(例如$ _GET),然后在UI页面中使用graph.php?data=...

答案 2 :(得分:1)

这不是输出带有多个图像的HTML页面,而是输出图像文件(将内容类型标题更改为image / png),因此您只能以这种方式输出一个图像,因为您无法再次发送标题一旦你已经发送了输出(这是imagepng()的作用)。

您要做的是创建另一个具有多个图像的页面,并使用具有上述功能的页面作为图像src。然后,您应该只传入图形参数(或将它们存储在会话或数据库中,无论您想要什么)并使用该信息来创建图像。

因此,如果您的上述代码位于名为“make_graph.php”的文件中,您将使用以下内容创建一个不同的HTML文件,并调整当前代码以从$ _GET获取其值。

<img src="make_graph.php?values=23;32;35;57;12" />
<img src="make_graph.php?values=123;232;335;157;102" />

然后我称之为“make_graph.php”的是,

<?php
function draw_graph($values)
{
    // ... your current code
}

$values = explode(";", $_GET['values']); // You'll probably want to sanitize $_GET input
make_graph($values);
?>

您可以尝试的另一件事是将所有图像合并为一个大图像。所以你创建了一个具有相同宽度的最终图像,但高度是所有4个图像组合的高度,最终图像是所有4个图形相互叠加的图像(我不是指分层,我的意思是第二个图形出现在1号以下等。)

答案 3 :(得分:0)

如果您需要四个图形,您可能需要做四个图像标记,每个图像标记指向一个单独的图像,或者一个包含图像的大图像一个接一个(即一个从0开始,第二个在{{ 1}}等等,整个图像的大小为$height。你不能只输出一个又一个的图像,它不会这样。

答案 4 :(得分:0)

在你的代码中只有一张图片! 而重新发明轮子我建议使用库 - 我建议pChart