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!!!