Avatar billede xeox Nybegynder
24. november 2005 - 12:03 Der er 16 kommentarer og
1 løsning

Hjælp til graf

Hej eksperter.

Er der nogle der kan hjælpe mig med at bygge en graf..

meget enkelt:

den skal se sådan ud:
http://www.jajo.midtfyn.net/lalala.jpg

Den får 2 stk dataer der skal være ved siden af hinaden, med 2 forskellige farver.. de dataer der kommer fra den forrige side kan se sådan ud:

motor1 = 35
motor2 = 95

så skal den bare sætte det ind i grafen.

Håber virkelig meget i kan hjælpe mig  - Spørg hvis i er det mindste tvivl-!
Avatar billede dmdisco Nybegynder
24. november 2005 - 12:35 #1
kig på gdlib funktionerne til at tegne med php eller svg billeder
http://dk2.php.net/manual/da/ref.image.php
http://www.w3.org/TR/SVG/
Avatar billede xeox Nybegynder
24. november 2005 - 12:59 #2
nja....... Det siger mig ikke meget, det derfor jeg opretter et spørgsmål hehe.. vil gerne have hjælp til at lave koden hvis det var mulig :o)
Avatar billede dmdisco Nybegynder
24. november 2005 - 14:21 #3
start med at prøve at lave et par streger når du så forstår hvordan gdlib arbejder og hvordan du bruger det så er resten sådan set bare matematik
Avatar billede dmdisco Nybegynder
24. november 2005 - 14:30 #4
taget fra http://dk2.php.net/manual/da/function.imagecreate.php


// A simple XY graph

<html>
<head>
     
<title>XY Graph</title>

<h2>Practice XY Graph</h2>
</head>
<body>

<?php
$left = 0;
$top = 0;
$x_size = 400;
$y_size = 400;

$char_width = 8;
$char_height = 11;

$x_start = $x_left + 100;
$y_start = $top + $char_height * 1.5;
$x_end = $x_start + $x_size;
$y_end = $y_start + $y_size;
$right = $x_start + $x_size + 40;
$bottom = $y_start + $y_size + $char_height * 1.5;

$graph_n = 100;
for($i = 0; $i < $graph_n; $i++ )
  {
  $graph_x[$i] = $i;
  $graph_y[$i] = $i * $i;
  }

  $min_x = 9e99;
  $min_y = 9e99;
  $max_x = -9e99;
  $max_y = -9e99;

  $avg_y = 0.0;
 
  for($i = 0; $i < $graph_n; $i++ )
      {
      if( $graph_x[$i] < $min_x )
          $min_x = $graph_x[i];

      if( $graph_x[$i] > $max_x )
          $max_x = $graph_x[$i];

      if( $graph_y[$i] < $min_y )
          $min_y = $graph_y[$i];

      if( $graph_y[$i] > $max_y )
          $max_y = $graph_y[$i];

      $avg_y += $graph_y[$i];
      }
 
  $avg_y = $avg_y / $graph_n;

  $min_x = 0;
  $min_y = 0;
  $max_x += $max_x * 0.05;
  $max_y += $max_y * 0.05;

$image = ImageCreate($right - $left, $bottom - $top);
$background_color = imagecolorallocate($image, 255, 255, 255);
$text_color = imagecolorallocate($image, 233, 14, 91);

$grey = ImageColorAllocate($image, 204, 204, 204);
$white = imagecolorallocate($image, 255, 255, 255);
$black = imagecolorallocate($image, 0, 0, 0);
$red = imagecolorallocate($image, 255, 0, 0);

imagerectangle($image, $left, $top, $right - 1, $bottom - 1, $black );
imagerectangle($image, $x_start, $y_start, $x_end, $y_end, $grey );

for($i = 0; $i < $graph_n; $i++ )
  {
  $pt_x = $x_start + ($x_end-$x_start)*($graph_x[$i]-$min_x)/($max_x-$min_x);
  $pt_y = $y_end - ($y_end - $y_start)*($graph_y[$i]-$min_y)/($max_y-$min_y);

//  imagesetpixel( $image, $pt_x, $pt_y, $black );
  imagechar($image, 2, $pt_x - 3, $pt_y - 10, '.', $black);
  }

$string = sprintf("%2.5f", $max_y);
imagestring($image, 4, $x_start - strlen($string) * $char_width, $y_start - $char_width, $string, $black);

$string = sprintf("%2.5f", $min_y);
imagestring($image, 4, $x_start - strlen($string) * $char_width, $y_end - $char_height, $string, $black);

$string = sprintf("%2.5f", $min_x);
imagestring($image, 4, $x_start - (strlen($string) * $char_width)/2, $y_end, $string, $black);
 
$string = sprintf("%2.5f", $max_x);
imagestring($image, 4, $x_end - (strlen($string) * $char_width) / 2, $y_end, $string, $black);

$x_title = 'x axis';
$y_title = 'y axis';

imagestring($image, 4, $x_start + ($x_end - $x_start) / 2 - strlen($x_title) * $char_width / 2, $y_end, $x_title, $black);

imagestring($image, 4, $char_width, ($y_end - $y_start) / 2, $y_title, $black);

header('Content-type: image/png');
$filename = sprintf("%d.png", time());
ImagePNG($image,$filename);
ImageDestroy($image);

printf("<img src='%s'> ", $filename);
?>

</body>
</html>
Avatar billede xeox Nybegynder
25. november 2005 - 12:06 #5
ja det er sådan en der skal laves.. men kan vi så få den til at tage med det info der kommer fra variablen $motor1 ?
Avatar billede dmdisco Nybegynder
28. november 2005 - 16:30 #6
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<?php
$points = array($motor1,$motor2);

$x_size = 250; // canvas størrelse min 200
$y_size = 250; // canvas størrelse min 200
$y = 100; // højeste værdi på y
$x = 10; // antal værdier på x

$image = imagecreate($x_size, $y_size);

$background_color = imagecolorallocate($image, 255, 255, 255);
$text_color = imagecolorallocate($image, 233, 14, 91);
$grey = imagecolorallocate($image, 204, 204, 204);
$white = imagecolorallocate($image, 255, 255, 255);
$black = imagecolorallocate($image, 0, 0, 0);
$red = imagecolorallocate($image, 255, 0, 0);
// for debug
imagerectangle($image, 0, 0, $x_size-1, $y_size-1, $black);

function graphMatrix($image, $x_size, $y_size, $x, $y, $text_color, $line_color, $dash_color){
    // laver graf baggrunden
    for ($i=0;$i<11;$i++) {
        imagestring($image, 4, 10, ($y_size-40)-((($y_size-80)/10)*$i), (($y/10)*$i), $text_color);
    }
    for ($i=0;$i<11;$i++) {
        imageline($image, 35, ((($y_size-80)/10)*$i)+40, 45, ((($y_size-80)/10)*$i)+40, $dash_color);
    }
   
    for ($i=0;$i<11;$i++) {
        imagestring($image, 4, 40+((($x_size-80)/10)*$i), $y_size-20, ($i*($x/10)), $text_color);
    }
    for ($i=0;$i<11;$i++) {
        imageline($image, 40+((($x_size-80)/10)*$i), $y_size-45, 40+((($x_size-80)/10)*$i), $y_size-35, $dash_color);
    }
    imageline($image, 40, 40, 40, $y_size-40, $line_color); // Y
    imageline($image, 40, $y_size-40, $x_size-40, $y_size-40, $line_color); // X
}
graphMatrix($image, $x_size, $y_size, $x, $y, $text_color, $black, $grey);
function drawPoints($image, $array, $color, $x_size, $y_size, $y_start=0) {
    $i=0;
    global $y;
    global $x;
    $y1 = ($y_size-40)-$y_start;
    foreach ($array as $value) {
        $x1 = 40+((($x_size-80)/$x)*$i);
        $x2 = 40+((($x_size-80)/$x)*($i+1));
        $y2 = ($y_size-40)-round((($y_size-80)/$y)*$value);
        imageline($image, $x1, $y1, $x2, $y2, $color);
        imagefilledellipse($image, $x2, $y2, 5, 5, $color);
        $y1 = $y2;
        $i++;
    }
}
drawPoints($image, $points, $red, $x_size, $y_size);
$filename = sprintf("%d.png", time());
ImagePNG($image,$filename);
ImageDestroy($image);

printf("<img src='%s'> ", $filename);
?>
</body>
</html>
Avatar billede xeox Nybegynder
28. november 2005 - 18:53 #7
waw, det hjælper på det !.. men kan de ikke blive skilt af motor1 og motor2 .. så de ikke er i den samme streg?
Avatar billede dmdisco Nybegynder
30. november 2005 - 10:01 #8
tjo du kan jo bare køre functionen drawPoints() 2 gange med hver sit array
Avatar billede dmdisco Nybegynder
30. november 2005 - 10:05 #9
som sådan her

<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<?php
$array1 = array(30,90,75,45,15,135);
$array2 = array(48,77,58,40,15,101);

$x_size = 250; // canvas størrelse min 200
$y_size = 250; // canvas størrelse min 200
$y = 150; // højeste værdi på y
$x = 10; // værdi på x

$image = imagecreate($x_size, $y_size);

$background_color = imagecolorallocate($image, 255, 255, 255);
$text_color = imagecolorallocate($image, 233, 14, 91);
$grey = imagecolorallocate($image, 204, 204, 204);
$white = imagecolorallocate($image, 255, 255, 255);
$black = imagecolorallocate($image, 0, 0, 0);
$red = imagecolorallocate($image, 255, 0, 0);
$blue = imagecolorallocate($image, 0, 0, 255);
// for debug
imagerectangle($image, 0, 0, $x_size-1, $y_size-1, $black);

function graphMatrix($image, $x_size, $y_size, $x, $y, $text_color, $line_color, $dash_color){
    // laver graf baggrunden
    for ($i=0;$i<11;$i++) {
        imagestring($image, 4, 10, ($y_size-40)-((($y_size-80)/10)*$i), (($y/10)*$i), $text_color);
    }
    for ($i=0;$i<11;$i++) {
        imageline($image, 35, ((($y_size-80)/10)*$i)+40, 45, ((($y_size-80)/10)*$i)+40, $dash_color);
    }
   
    for ($i=0;$i<11;$i++) {
        imagestring($image, 4, 40+((($x_size-80)/10)*$i), $y_size-20, ($i*($x/10)), $text_color);
    }
    for ($i=0;$i<11;$i++) {
        imageline($image, 40+((($x_size-80)/10)*$i), $y_size-45, 40+((($x_size-80)/10)*$i), $y_size-35, $dash_color);
    }
    imageline($image, 40, 40, 40, $y_size-40, $line_color); // Y
    imageline($image, 40, $y_size-40, $x_size-40, $y_size-40, $line_color); // X
}
graphMatrix($image, $x_size, $y_size, $x, $y, $text_color, $black, $grey);
function drawPoints($image, $array, $color, $x_size, $y_size, $y_start=0) {
    $i=0;
    global $y;
    global $x;
    $y1 = ($y_size-40)-$y_start;
    foreach ($array as $value) {
        $x1 = 40+((($x_size-80)/$x)*$i);
        $x2 = 40+((($x_size-80)/$x)*($i+1));
        $y2 = ($y_size-40)-round((($y_size-80)/$y)*$value);
        imageline($image, $x1, $y1, $x2, $y2, $color);
        imagefilledellipse($image, $x2, $y2, 5, 5, $color);
        $y1 = $y2;
        $i++;
    }
}
drawPoints($image, $array1, $red, $x_size, $y_size);
drawPoints($image, $array2, $blue, $x_size, $y_size);
$filename = sprintf("%d.png", time());
ImagePNG($image,$filename);
ImageDestroy($image);

printf("<img src='%s'> ", $filename);
?>
</body>
</html>
Avatar billede xeox Nybegynder
30. november 2005 - 22:30 #10
jeps, præcis sådan, men så bare med dataen fra motor1 og motor2
Avatar billede xeox Nybegynder
30. november 2005 - 22:45 #11
Ja er altså klar over det skal gøres sådan har:

$motor1 = $_GET['motor1'];
$motor2 = $_GET['motor2'];
$array1 = array($motor1);
$array2 = array($motor2);

foroven hehe !.. men jeg skal egentligt have den til at gå 250 op og så kan der måske komme til at stå noget nedenunder talene?
Avatar billede dmdisco Nybegynder
02. december 2005 - 10:12 #12
denne sætter du bare til 250
$y = 150; // højeste værdi på y
mht x linien skal du ændre denne i graphMatrix funktionen
    for ($i=0;$i<11;$i++) {
        imagestring($image, 4, 40+((($x_size-80)/10)*$i), $y_size-20, ($i*($x/10)), $text_color);
    }

jeg har bare lavet denne som et eksempel til hvordan man kan gøre og jeg er helt sikker på at det kan gøres på en nemmere og flottere måde, men jeg har desværre ikke tid til at lave det for dig lige pt. men prøv selv så skal jeg nok hjælpe alt hvad jeg kan :)
Avatar billede xeox Nybegynder
02. december 2005 - 10:45 #13
Nej det er helt i orden, men det jeg mente var mere om man på en eller anden måde kunne sætte noget text under talene som du kan se på tegningen oppe ovenover :)
Avatar billede dmdisco Nybegynder
06. december 2005 - 10:15 #14
ja med imagestring($image, 4, int x, int y, "det du vil have skrevet", $black) bare sæt x og y til hvor du vil have teksten til at stå
Avatar billede xeox Nybegynder
06. december 2005 - 10:37 #15
okay, det vil jeg lige prøve senere.. men i hvert fald tusind tak for hjælpen, smider du et svar??
Avatar billede dmdisco Nybegynder
06. december 2005 - 12:48 #16
skal jeg gøre
sig til hvis der bliver flere spørgsmål om det
Avatar billede xeox Nybegynder
13. december 2005 - 12:14 #17
jo tak.
siger mange tak.

-lukket-
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester