moO: Chart plotten funktioniert nicht, aber keinen plan warum!

Guten Morgen,

ich habe ein Problem das mich bald wahnsinnig macht weil ich seit zwei Tagn keinen Schritt vorwärts komme.

Die folgende Funktion soll mir ein Pareto-Chart plotten.

Übergeben werden ein Array mit den Werten, wieviele Balken angezeigt werden sollen, Breite und Höhe der Grafik und die Abstände zwischen den Balken.

Im ersten Teil erstelle ich Grafik und Grid, das funktioniert ohne Probleme.

Dann will ich die Balken zeichnen und hier fängt das Problem an: er zeichnet keine Balken, obwohl die Werte der einzelnen Variablen wie auch die Berechnungen alle das richtige Ergebnis liefern (ich habe wirklich alles versucht, jeden Zwischenschritt und Zwischenwert genau betrachtet, explizit in ints umgewandelt und so weiter...).

Vllt bin ich inzwischen betriebsblind und seh es einfach nicht...

Aso, wenn ich in die Schleifen von Hand rectangles schreibe mit werten, also keinen Variablen, wird die grafik gezeichnet!

Und jetzt wirds richtig irre: Wenn ich den Teil 'for tests' einkommentiere und diese fünf werte an das übergebene array anhäge, werden diese fünf Werte auch sauber geplottet, obwohl array_sum(), max() und alles andere stimmen... auch wenn ich nur einen Wert anfüge (einen hohen) wird nur dieser eine, aber nicht die anderen geplottet...

var_dump auch $valuesArray sieht aber gut aus...

Ich blicks nicht...

  
function plotPareto($valuesArray,$barsToShow,$lenX,$lenY,$marginInPercent){  
  
     //for tests  
     /*  
     $valuesArray[]=5;  
     $valuesArray[]=4;  
     $valuesArray[]=3;  
     $valuesArray[]=2;  
     $valuesArray[]=1;  
     */  
  
     //init  
	$percentageBar=20;  
     $widthOfSegment=$lenX/$barsToShow;  
     $marginForSegment=$widthOfSegment/100*$marginInPercent/2;  
	$barWidth=$widthOfSegment-2*$marginForSegment;  
  
     //prepare data  
	$highestValueInArray=max($valuesArray);  
	$ratio=$lenY/3*2/$highestValueInArray;  
	$sumOfArrayValues=array_sum($valuesArray);  
	array_multisort($valuesArray,SORT_DESC,SORT_NUMERIC);  
  
	//create handler for image  
	$img=imagecreate($lenX+$percentageBar,$lenY);  
  
	//set background color to bright white and fill image with that color  
	$background_color=imagecolorallocate($img,255,255,255);  
	imagefilledrectangle($img,0,0,$lenX+$percentageBar,$lenY,$background_color);  
  
	//draw grid in background  
	$gridFontColor=imagecolorallocate($img,0,208,255);  
	$gridColor=imagecolorallocate($img,185,242,255);  
	for($grid=0;$grid<=100;$grid+=10){  
          imageline($img,$percentageBar,$lenY/100*$grid,$lenX+$percentageBar,$lenY/100*$grid,$gridColor);  
          imagestring($img,1,0,$lenY/100*$grid,(100-$grid).'%',$gridFontColor);  
	     }  
  
     //Draw Bars  
	$barColor=imagecolorallocate($img,122,122,122);  
	$startX=$percentageBar;  
	$startY=$lenY;  
  
	for($i=0;$i<$barsToShow;$i++){  
		imagefilledrectangle($img,$startX+$marginForSegment,$startY,$startX+$marginForSegment+$barWidth,$startY-$valuesArray[$i]*$ratio,$barColor);  
		//imageline is for test  
          imageline($img,$startX+$marginForSegment,$startY,$startX+$marginForSegment+$barWidth,$startY-$valuesArray[$i]*$ratio,$barColor);  
		$startX+=$widthOfSegment;  
	     }  
  
     //draw lines for pareto  
     //generate initial values for loop  
	$lineColor=imagecolorallocate($img,255,0,0);  
	$ratio=$lenY/100;  
	$startX=$percentageBar+$widthOfSegment/2;  
	$startY=$lenY-(($valuesArray[0]/$sumOfArrayValues)*100*$ratio);  
	$endValue=$valuesArray[0];  
	imagesetthickness($img,2);  
  
	for($i=0;$i<$barsToShow-1;$i++){  
		$startValue=$endValue;  
		$endValue=$startValue+$valuesArray[$i+1];  
		$startY=$lenY-(($startValue/$sumOfArrayValues)*100*$ratio);  
		$endY=$lenY-(($endValue/$sumOfArrayValues)*100*$ratio);;  
		imageline($img,$startX,$startY,$startX+$widthOfSegment,$endY,$lineColor);  
		//headline  
		imagestring($img,2,$startX-10,5,round((($startValue/$sumOfArrayValues)*100),2).'%',$lineColor);  
		imagestring($img,2,$startX+$widthOfSegment-10,5,round((($endValue/$sumOfArrayValues)*100),2).'%',$lineColor);  
		//bottomline  
		imagestring($img,2,$startX-5,$lenY-15,$valuesArray[$i],$lineColor);  
		imagestring($img,2,$startX+$widthOfSegment-5,$lenY-15,$valuesArray[$i+1],$lineColor);  
		$startX+=$widthOfSegment;  
	}  
  
	imagejpeg($img,'pareto.jpg');  
     echo('<img src="pareto.jpg">');  
}  

Ok, falls jemand was sieht, ich seh's nicht :(

DANKE!!!

  1. Hi!

    Ok, falls jemand was sieht, ich seh's nicht :(

    Ich sehe auch nichts, denn du hast nur die Funktion veröffentlicht und nicht gezeigt, wie du sie (d.h. mit welchen Werten) aufrufst und was dabei entstehen soll.

    Lo!

    1. <?php  
      $arr[]=(2,3,2,1);  
      $bars=3;  
      $width=400;  
      $height=150;  
      $margin=20;  
      plotPareto($arr,$bars,$width,$height,$margin);  
      ?>
      
      1. Statt $arr[]=(2,3,2,1);
        meinte ich natürlich
        $arr = array(2,3,2,1);

      2. Moin!

        <?php

        $arr[]=(2,3,2,1);

        unset $arr;
        $arr=array(2,3,2,1);

        $bars=3;
        $width=400;
        $height=150;
        $margin=20;
        ?>

        MFFG (Mit freundlich- friedfertigem Grinsen)  
          
        fastix  
        
        -- 
        [Des fastix kleines CMS](http://www.fastix.org/fastix-cms/)
        
      3. Hi!

        [...]
        plotPareto($arr,$bars,$width,$height,$margin);

        Damit sehe ich drei graue Balken, darüber jeweils eine Prozentzahl und eine schräge Linie.

        Lo!

  2. Moin!

    Also folgendes hat das erwartete Ergebnis gebracht:

    $valuesArray[]=400;  
    $valuesArray[]=20;  
    $valuesArray[]=30;  
    $valuesArray[]=50;  
    $valuesArray[]=70;  
      
    $barsToShow=5;  
    $lenX=400;  
    $lenY=400;  
    $marginInPercent=1;  
    plotPareto($valuesArray,$barsToShow,$lenX,$lenY,$marginInPercent);
    

    Scheint also doch an der Wertübergabe zu liegen.

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix

  3. Also falls es noch jemanden juckt, der Idiot sitzt mein direkt vor der Tastatur :D

    Die Funktion läuft einwandfrei, der einzige Haken war, das ich sie zweimal habe laufen lassen, einmal mit, einmal ohne Daten, also einmal volle Grafik mit balken, einmal leere grafik ohne balken, beide grafiken hatten den selben dateinamen, also wurde die volle mit der leeren überschrieben und ich sah immer nur leere im browser.

    Hallo, ich bin blöd, freut mich sie kennen zu lernen!

    :)

    1. Hi!

      Die Funktion läuft einwandfrei, der einzige Haken war, das ich sie zweimal habe laufen lassen, [...] beide grafiken hatten den selben dateinamen, also wurde die volle mit der leeren überschrieben und ich sah immer nur leere im browser.

      Warum erzeugst du überhaupt eine Datei, wenn du die Grafik, so wie es sich anhört, nur zum Zwecke des Ansehens benötigst?

      Lo!

      1. Hi!

        Die Funktion läuft einwandfrei, der einzige Haken war, das ich sie zweimal habe laufen lassen, [...] beide grafiken hatten den selben dateinamen, also wurde die volle mit der leeren überschrieben und ich sah immer nur leere im browser.

        Warum erzeugst du überhaupt eine Datei, wenn du die Grafik, so wie es sich anhört, nur zum Zwecke des Ansehens benötigst?

        Lo!

        Öhm, um ehrlich zu sein, weil ich nur diesen Weg kenne :D
        Wie kann ich mir denn die Grafik ad-hoc anzeigen lassen ohne am header rumpfuschen zu müssen?

        1. Hi!

          Warum erzeugst du überhaupt eine Datei, wenn du die Grafik, so wie es sich anhört, nur zum Zwecke des Ansehens benötigst?
          Öhm, um ehrlich zu sein, weil ich nur diesen Weg kenne :D
          Wie kann ich mir denn die Grafik ad-hoc anzeigen lassen ohne am header rumpfuschen zu müssen?

          Eine HTTP-Ressource sollte immer mit dem passenden Content-Type ausgeliefert werden, wenn man ein Default-Verhalten des Browsers für den jeweiligen Datentyp erwartet. Insofern kommst du nicht an einer Header-Änderung herum, wenn du sie on-the-fly erzeugen willst. Den Content-Type zu setzen ist keine Hexerei und sollte eigentlich immer möglich(/vom Hoster erlaubt) sein.

          Wenn du diesen Weg gehen möchtest, musst du allerdings etwas umbauen. Das Grafik-Script muss selbständig arbeiten können. Das heißt, es muss seine Parameter über den Querystring erhalten, da nicht bekannt ist, in welcher Reihenfolge die Requests beim Server ankommen. Das ist wichtig, wenn mehrere Grafiken auf der Seite eingebunden sind. Auch der Browsercache kann dafür sorgen, dass nur bestimmte Ressourcen nachgefragt werden, also beispielsweise nur die Grafik ohne die einbettende HTML-Seite, weil letztere aus dem Cache genommen wird. Deshalb nützen dir zum Beispiel in Sessions abgelegte Werte herzlich wenig.

          Lo!