2011-01-12 28 views
1

Ich verwende PHP, um Graphen aus Arrays zu generieren. Ich möchte mehrere Grafiken auf der gleichen Seite erstellen, um einen zusammenfassenden Bericht aus Antworten zu erstellen, die aus einer Datenbank extrahiert wurden. Derzeit verwende ich diesen Code und kann nur einen einzigen Graphen erstellen. Welche Ergänzungen zum Code muss ich machen, um mehrere Graphen zu erhalten?Zeichnen von Graphen in 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

danke für die Korrektur des Codes. hübscher code = einfacher zu lesen –

Antwort

2

Ihre Ausgabe mit header gemacht wird, so kippen Ausgabe, die Sie zweimal (kein Header nach der Ausgabe erlaubt ist). Sie sollten einen Blick als Plot-Dienstprogramm (Google charts zum Beispiel), oder verwenden Sie ein PHP-Skript für Zeichnungsanforderung Parameter ($ _GET für Beispiel) und dann graph.php?data=... in Ihrer UI-Seite.

+0

eigentlich mehrere Header zulässig sind, aber nicht, nachdem eine andere Ausgabe gesendet wurde. – StasM

3

Ich bin kein GD-Experte, also bevorzuge ich die Google Chart Tools API. Es speichert eine Menge PHP-Grafiken, die Alpträume verursachen, und verfügt über eine Reihe von Funktionen zum Bereitstellen, Formatieren und Formatieren von Daten.

Wenn Sie bei Ihrem Code bleiben möchten, ist das auch in Ordnung. Ich beginne mit dem Offensichtlichen: Ist GD aktiviert? Wenn dies der Fall ist, versucht Ihr Problem, mehrere Bilder auf einer Seite zu exportieren. Entfernen Sie alle bis auf einen der Aufrufe von draw_graph und sehen Sie, welche Art von Ausgabe Sie erhalten.

<?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)); 
?> 
+0

ich bekomme einen einzigen ausgang ... aber was ich brauche ist mehrere ausgänge ... der erste drawgraph ist giginv mir ein ausgang ... – user434885

+0

müssen Sie etwas an Ihrer Funktion nacharbeiten, dann ... Ich schlage vor, eine Masterfunktion zu erstellen, die 'draw_graph' aufruft und eine GD-Instanz zum Schreiben und einen Y-Offset übergibt, der sicherstellt, dass keiner der Graphen überlappt. –

+0

auch ein anderes Problem, das ich habe, ist, dass dieser PHP-Code auf einem lokalen Server laufen wird, der keinen Zugang zum Internet hat, also kann ich google apis – user434885

0

Wenn Sie vier Diagramme benötigen, würden Sie entweder vier Image-Tags zu tun, von denen jede auf ein separates Bild bezieht, oder ein großes Bild, das die Bilder nacheinander enthält (dh eine bei 0 beginnt, Sekunde bei $height usw. und das ganze Bild würde Größe $height*4 haben Sie können nicht einfach ein Bild nach dem anderen ausgeben, es funktioniert nicht so

1

Dies ist nicht eine HTML-Seite mit mehreren Bildern ausgeben, sondern eine Bilddatei (Sie ändern den Header des Inhaltstyps in image/png), so dass Sie nur ein Bild auf diese Weise ausgeben können, da Sie die Header nicht mehr senden können, nachdem Sie die Ausgabe bereits gesendet haben (imagepng() d oes).

Was Sie tun möchten, ist eine andere Seite zu erstellen, die mehrere Bilder haben wird, und die Seite mit der obigen Funktion als Bild src verwenden. Sie sollten dann einfach die Diagrammparameter übergeben (oder sie in einer Sitzung oder Datenbank speichern, wie Sie wollen) und diese Informationen verwenden, um das Bild zu erstellen.

Wenn also der obige Code in einer Datei namens "make_graph.php" enthalten war, würden Sie mit den folgenden Informationen eine andere HTML-Datei erstellen und Ihren aktuellen Code anpassen, um seine Werte von $ _GET zu übernehmen.

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

Dann, was ich als „make_graph.php“ wäre,

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

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

Die andere Sache, die Sie würden versuchen könnten, um alle Bilder zu einem großen Bild zu verschmelzen. Sie erzeugen also ein endgültiges Bild, das die gleiche Breite hat, aber die Höhe ist die Summe aller 4 Bilder, und das endgültige Bild ist das von allen 4 übereinander liegenden Graphen (ich meine nicht den Layer, ich meine den zweiten Graphen) erscheint unter dem 1., usw.).

0

In Ihrem Code nur ein Bild zu der Zeit! und stattdessen das Rad neu erfinden Ich schlage vor, Bibliothek zu verwenden - ich empfehle pChart

Verwandte Themen