Рисование графиков в PHP - PullRequest
1 голос
/ 12 января 2011

Я использую 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 ]

3 голосов
/ 12 января 2011

Я не эксперт по 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 ) );
?>
2 голосов
/ 12 января 2011

Ваш вывод сделан с header, поэтому вы не можете выводить дважды (заголовок после вывода не разрешен). Вам следует взглянуть на какую-нибудь графическую утилиту (например, Google charts ) или использовать php-скрипт для параметра запроса отрисовки ($ _GET для примера), а затем использовать graph.php?data=... на своей странице пользовательского интерфейса.

1 голос
/ 12 января 2011

Это не вывод HTML-страницы с несколькими изображениями, а файл изображения (вы изменяете заголовок типа содержимого на image / png), так что вы можете вывести таким образом только одно изображение, так как вы не можете снова отправлять заголовки как только вы уже отправили вывод (что делает imagepng()).

То, что вы хотите сделать, это создать другую страницу, которая будет иметь несколько изображений, и использовать страницу с вышеуказанной функцией в качестве источника изображения. Затем вам нужно просто передать параметры графика (или сохранить их в сеансе или базе данных, как вы хотите) и использовать эту информацию для создания изображения.

Таким образом, если указанный выше код был в файле с именем "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 и т. д.).

0 голосов
/ 12 января 2011

В вашем коде только одна картинка за раз!и вместо того, чтобы изобретать велосипед, я предлагаю использовать библиотеку - я рекомендую pChart

0 голосов
/ 12 января 2011

Если вам нужны четыре графика, вам придется либо сделать четыре тега изображения, каждый из которых относится к отдельному изображению, либо одно большое изображение, которое содержит изображения один за другим (т.е. один начинается с 0, второй - с $height и т. д., и все изображение будет иметь размер $height*4. Вы не можете просто выводить одно изображение за другим, оно не работает таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...