[php] loop voor grafiek maken

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben gister enthousiast eens begonnen met GD Lib in PHP. Vond dat het wel tijd werkt om dat te leren. Nu ben ik met een tutorial van phpfreakz.nl aan de hand aan de slag gegaan. Begonnen met een leeg notpad scherm, en moet zeggen, ben aardig vergekomen.

Als input waarde heb ik even een test arraytje gemaakt, wel zo makkelijkelijk. Na wat klooien kwam ik met het onderstaande resultaat uit...

Afbeeldingslocatie: http://217.170.10.12/naamloos.jpg

Allemaal leuk en aardig, probleem waar ik alleen tegen aanliep was dat ik het niet voor mekaar kreeg om de staaf grafiek gelijk te krijgen aan de nr's aan de linker kant. Nu hoop ik dat jullie me misschien op weg kunnen helpen, hoe ik dit dus het beste kan doen. Heb heb zelf al van alles geprobeerd, maar te vergeeft, weet gewoon 'php technisch' niet hoe het mogelijk is.

Hier me scriptje, zal best een zooi zijn, maar is me eerste EIGEN gd/php browsel...

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
<?

$dag[] = 80;
$dag[] = 60;
$dag[] = 55;
$dag[] = 45;
$dag[] = 99;
$dag[] = 142;
$dag[] = 45;
$dag[] = 32;
$dag[] = 65;
$dag[] = 85;
$dag[] = 55;
$dag[] = 80;
$dag[] = 60;
$dag[] = 55;

$dag2[] = jan;
$dag2[] = feb;
$dag2[] = ads;
$dag2[] = sdf;
$dag2[] = sdd;
$dag2[] = jan;
$dag2[] = feb;
$dag2[] = ads;
$dag2[] = sdf;
$dag2[] = sdd;
$dag2[] = jan;
$dag2[] = feb;
$dag2[] = ads;
$dag2[] = ads;

$aantal = count($dag2);

    $width  = 450;
    $height = 300;

        $imgp = imageCreate($width, $height);

        $wit    = imageColorAllocate($imgp, 255,255,255);
        $rood   = imageColorAllocate($imgp, 241,25,35);
    $zwart  = imageColorAllocate($imgp, 0,0,0);
    $grijs  = imageColorAllocate($imgp, 228,228,228);


// maken van de grid lijnen
$grid = 20;
if ($grid > 0)  { 

        for ($v=20;$v<=429;$v=$v+$grid) { 
                        imageline($imgp, 21, $v, 429, $v, $grijs); 
                        }
        } 

// vierkant maken in zwart...
imageLine ($imgp, 20, 20, 430, 20, $zwart);
imageLine ($imgp, 20, 280, 430, 280, $zwart);
imageLine ($imgp, 20, 20, 20, 280, $zwart);
imageLine ($imgp, 430, 20, 430, 280, $zwart);

$breedte2 = 15;

$x = $breedte2 + 10; // $x = 30
 
$i=0;

while($i<=$aantal) {

$z=$x*$i+25;

imageString($imgp, 2, $z, 285 , $dag2[$i], $zwart);

$i++;

}


$maxheight = $height - 20; // De maximale hoogte van de grafiek 

$max_pos = 0; 
for ($i=0;$i<count($dag);$i++){ 
  if ($max_pos < $dag[$i]) { 
    $max_pos = $dag[$i]; 
  } 
} 


$i=0;

while($i<=$aantal) {

$z=$x*$i+25;

imageString($imgp, 2, $z, 8 , $dag[$i], $zwart);


// DIT MAAKT DE STAAFJES NU...
imagefilledrectangle($imgp, $z, $dag[$i], ($z + $breedte2), 279, $grijs); 

$i++;
}

$max_value = $max_pos / $maxheight; // 2.86

//echo $max_pos; //142

$step = $max_value; 


for ($v=0;$v<=($height-40);$v=$v=$v+15) { 

$pos = floor((($height-20) - $v) * $step); 

//echo "pos = $pos / z = $z / v = $v<br>";

imagestring($imgp,1,1, $v+20, $pos,$zwart); 

} 
        header("Content-Type: image/png");
        imagePng($imgp);
        imageDestroy($imgp); 
?>

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

Voor zover ik kan zien trek je die -40 en -20 op de verkeerde momenten van je hoogte af.

Probeer eerst de range (0-142) te mappen op het bereik van je grafiek (0-260), en daarna dit op de juiste positie plaatsen. Zorg dus eerst dat je de uiteindelijke afmetingen van het balkje hebt en verplaats hem daarnaa naar de juiste plek.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ja, ok. ZO bv

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?
$maxheight = $height - 20; // 280 = De maximale hoogte van de grafiek 

$max_value = $max_pos / $maxheight; // 142 / 280 = 0.50714

$step = $max_value; 


for ($v=0;$v<=($height);$v=$v=$v+15) { 

$pos = floor((($height) - $v) * $step); 

//echo "pos = $pos / z = $z / v = $v<br>";

imagestring($imgp,1,1, $v+20, ($pos-10),$zwart); 

} 
?>


Maar los daarvan, weet ik nog niet hoe ik de grafiek moet maken, en daar ging het eigenlijk om.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

Maximale hoogte van de grafiek is niet 280, maar 260 ;). Het is immers tussen 20 en 280. Als je vervolgens er voor zorgt dat je dezelfde schaling voor je as gebruikt moet het gelijk staan. Voor de rest snap ik niet wat je bedoeld met 'grafiek maken'. Je hebt toch al een mooi staafdiagrammetje klaar waarbij alleen de schaling mis gaat?


Wat is trouwens $v=$v=$v+15? ;).. Probeer je probleem gewoon stapsgewijs aan te pakken...
1 - schaal waardes naar pixelwaardes op je scherm
2 - teken framework (lijntjes ed)
3 - plaats balkjes op de juiste posities (Je hebt de hoogte van het balkje, je weet waar de onderkant moet staan, dan kun je met die 2 getallen ook wel uitrekenen waar het startpunt zou moeten staan)

[ Voor 37% gewijzigd door Janoz op 02-07-2003 11:02 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dus hij moet van 142 tot 0 lopen bedoel je? En de 0 ook echt echo' en. Dat krijg ik dus niet voor mekaar. Kun je mij misschien helpen met dat loopje om de zijkant goed te krijgen. Dan ben ik al een grote stap dichterbij.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Wat is de functie om de hoogste waarde uit een array uit te lezen? Kan hem even niet vinden op PHP.net

PS: me prob van hierboven is opgelost :)

Acties:
  • 0 Henk 'm!

  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 16-08 17:16
Verwijderd schreef op 02 July 2003 @ 12:23:
Wat is de functie om de hoogste waarde uit een array uit te lezen? Kan hem even niet vinden op PHP.net
http://nl2.php.net/max.

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Thx digtree, dat is hem idd. Het scriptje is bijna helemaal zoals ik hem wil. Heb het voor mekaar gekregen dat de bargrafiekjes goed komen. Enige probleem is nog de nrs aan de zijkant, die kloppen niet helemaal 100%. Hoogste waarde komt idd op 20px van de top, maar helaas krijg ik 0 nu op 280px van de bovenkant. Hij zet daar 12 neer, en daar onder nog 5...

Wat doe ik dus nog fout aan het onderste gedeelte van het script?

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
<?
// test data in array
$dag[] = 80;
$dag[] = 60;
$dag[] = 55;
$dag[] = 45;
$dag[] = 99;
$dag[] = 142;
$dag[] = 45;
$dag[] = 32;
$dag[] = 65;
$dag[] = 85;
$dag[] = 55;
$dag[] = 80;
$dag[] = 60;
$dag[] = 55;

$dag2[] = jan;
$dag2[] = feb;
$dag2[] = ads;
$dag2[] = sdf;
$dag2[] = sdd;
$dag2[] = jan;
$dag2[] = feb;
$dag2[] = ads;
$dag2[] = sdf;
$dag2[] = sdd;
$dag2[] = jan;
$dag2[] = feb;
$dag2[] = ads;
$dag2[] = ads;

$aantal     = count($dag); // tellen van aantal waardes in array
$max_pos    = max($dag);   // vinden van hoogste waarde uit array
$width      = 450;  // breedte plaatje
$height     = 300; // hoogste plaatje
$grid       = 20;  // afstand van grid lijnen
$breedte2   = 15;  // breedte balkje
$breedte3   = 10;  // afstand tussen balkjes

$imgp = imageCreate($width, $height); // bakken van het plaatje

// kleuren defineren
$wit    = imageColorAllocate($imgp, 255,255,255);
$rood   = imageColorAllocate($imgp, 241,25,35);
$zwart  = imageColorAllocate($imgp, 0,0,0);
$grijs  = imageColorAllocate($imgp, 228,228,228);


// maken van de grid lijnen horizontaal
for($v=20;$v<=429;$v=$v+$grid)  { 
                imageline($imgp, 21, $v, 429, $v, $grijs); 
                }

// vierkant maken in zwart...
imageline ($imgp, 20, 20, 430, 20, $zwart);
imageline ($imgp, 20, 280, 430, 280, $zwart);
imageline ($imgp, 20, 20, 20, 280, $zwart);
imageline ($imgp, 430, 20, 430, 280, $zwart);

// Het berekenen waar de horizontale texten onder moeten komen
$x  = $breedte2 + $breedte3;
$i  = 0;

while($i<=$aantal)  { 
            $z=$x*$i+25;
            imageString($imgp, 2, $z, 285 , $dag2[$i], $zwart);
            $i++;
            }

// Het berekenen waar de horizontale waardes boven moeten komen
$x  = $breedte2 + $breedte3;
$i  = 0;

while($i<=$aantal)  {
            $z=$x*$i+25;
            imageString($imgp, 2, $z, 8 , $dag[$i], $zwart);

// berekenen van de barlengte
$procent    = $max_pos / 100;
$procent    = $dag[$i]/$procent;
$barlength  = round(260 * ($procent / 100));
$barlength  = 280 - $barlength;

            imagefilledrectangle($imgp, $z, $barlength, ($z + $breedte2), 279, $grijs); 
            $i++;
            }

// HIER GAAT HET FOUT, BIJ HET BEREKENEN VAN DE LINKER VERTICALE LIJN MET NRS
$maxheight  = $height - 20; // 280 = De maximale hoogte van de grafiek 
$max_value  = $max_pos / $maxheight; // 142 / 280 = 0.50714 
$step       = $max_value; 

for ($v=0;$v<=($height-20);$v=$v=$v+15) { 

$pos = floor((($height) - $v) * $step); 

//echo "pos = $pos / z = $z / v = $v<br>"; 

imagestring($imgp,1,1, $v+20, ($pos-10),$zwart); 
} 


// uitpoepen van het plaatje
header("Content-Type: image/png");
imagePng($imgp);
imageDestroy($imgp); 
?>

Acties:
  • 0 Henk 'm!

  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 16-08 17:16
PHP:
1
$maxheight = $height - 40;

in plaats van
PHP:
1
$maxheight = $height - 20;
Verder moet je nog even naar je for-lus kijken, want die klopt ook niet.
offtopic:
het is bigtree, geen digtree ;)

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.

Pagina: 1