我使用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
?>
答案 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