Counters Code

  Home arrow Counters Code arrow Graph Maker Function
COUNTERS CODE

Graph Maker Function
By: Codewalkers
  • Search For More Articles!
  • Disclaimer
  • Author Terms
  • Rating: 2 stars2 stars2 stars2 stars2 stars / 10
    2004-01-07

    Table of Contents:

     
     

    SEARCH CODEWALKERS

    TOOLS YOU CAN USE

    advertisement
    Takes an array or data, an array of options and produces a graph image of the data array. Has options for colors, size of image, transparancy, titles (x, y, graph). Could use some improvements though.

    By : ahzzmandius

    function GraphRows($rows, $opts)
    {
    # options
    #
    # box_x_size: width of values area
    # box_y_size: height of the values area
    # x_size: total width of the graph
    # y_size: total height of the graph
    # x_val: array element of record to assign as x_value
    # y_val: array element to assign as y_value
    # x_label: label for the Bottom of the graph
    # y_label: label for the left side
    # font: font number to use from system
    # font_file: file to use as the font
    # show_x_val: true == show X value of each bar with the y_label
    # show_y_val: true == show Y value labels
    # title: string for top of graph
    # bar_color: color array to use for bars
    # box_color: color to use for the box edging and value box.
    # label_color: color for the labels
    # val_color: color to to use for the values
    # title_color: color to use for the title.
    # bg_color: color for the background.
    # bg_trans: make the background transparant.
    # img_format: can be "png", "gif", or "jpg".

    $defaults = array("show_x_val" => 1,
    "show_y_val" => 1,
    "show_y_lines" => 1,
    "font" => 1,
    "x_val" => NULL,
    "y_val" => NULL,
    "title" => NULL,
    "x_label" => NULL,
    "y_label" => NULL,
    "x_title" => NULL,
    "y_title" => NULL,
    "x_slant" => NULL,
    "font_file" => NULL,
    "x_size" => NULL,
    "y_size" => NULL,
    "box_x_size" => 300,
    "box_y_size" => 200,
    "right_margin" => 2,
    "fg_color" => array(1,1,1),
    "bg_color" => array(232, 226, 202),
    "bg_trans" => NULL,
    "bar_color" => array(128, 128, 128),
    "box_color" => NULL,
    "val_color" => NULL,
    "title_color" => NULL,
    "return" => NULL,
    "img_format" => "png");
    foreach($defaults as $opt => $val)
    {
    if(!array_Key_exists($opt, $opts))
    {
    $opts["$opt"] = $val;
    }
    }
    if($opts["font_file"])
    {
    $opts["font"] =imageloadfont($opts["font_file"]);
    }
    $font_y = imagefontheight($opts["font"]);
    $font_x = imagefontwidth($opts["font"]);

    #the boxed area with be 2 from the top and right, 30 from the left, and 12 from the bottom.
    # the border will be 1px wide.
    $max_x = 0;
    $max_y = 0;
    $longest_x = 0;
    $longest_y = 0;
    $x_mod = 1.3;
    $y_mod = 1.3;

    # find the longest x and y value str lengths for the label margin size.
    foreach($rows as $idx => $row)
    {
    $y_val = $row;
    $x_val = $idx;
    if(is_array($row))
    {
    foreach($row as $idx => $val)
    {
    $y_val = $val;
    break;
    }
    if($opts["y_val"])
    {
    if(array_key_exists($opts["y_val"], $row))
    {
    $y_val = $row[$opts["y_val"]];
    }
    }

    if($opts["x_val"])
    {
    if(array_key_exists($opts["x_val"], $row))
    {
    $x_val = $row[$opts["x_val"]];
    }
    }
    }
    if($y_val > $max_y)
    {
    $max_y = $y_val;
    }
    if($x_val > $max_x)
    {
    $max_x = $x_val;
    }
    $y_len = strlen($y_val);
    $x_len = strlen($x_val);
    if($y_len > $longest_y)
    {
    $longest_y = $y_len;
    }
    if($x_len > $longest_x)
    {
    $longest_x = $x_len;
    }
    }
    $left_margin = 0;
    $bottom_margin = 0;
    $top_margin = $font_y * ($y_mod/2);
    if($opts["title"] != NULL)
    {
    $top_margin = $font_y * $y_mod + $font_y * ($y_mod/2);
    }
    if($opts["show_x_val"])
    {
    $bottom_margin += $font_y * $y_mod;
    if($opts["x_slant"])
    {
    $bottom_margin += $font_x * $longest_x - $font_y * $y_mod;
    }
    }
    if($opts["show_y_in_x"])
    {
    $bottom_margin += $font_y * $y_mod;
    }
    if($opts["x_title"])
    {
    $bottom_margin += $font_y * $y_mod;
    }
    if($opts["show_y_val"])
    {
    $left_margin += $font_x * $x_mod * $longest_y;
    }
    if($opts["y_title"])
    {
    $t_margin = $font_y * $y_mod + $font_y * ($y_mod/2);
    $l_margin = $font_x * $x_mod * strlen($opts["y_title"]);
    if($t_margin > $top_margin)
    {
    $top_margin = $t_margin;
    }
    if($l_margin > $left_margin)
    {
    $left_margin = $l_margin;
    }
    }
    # we have to calculate the x and y image and box sizes depending on which is present.
    # img sizing overrides the box size;
    if($opts["x_size"])
    {
    $opts["box_x_size"] = $img_x - $left_margin - 2 - $opts["right_margin"] ;
    }
    else
    {
    $opts["x_size"] = $left_margin + $opts["box_x_size"] + 2 + $opts["right_margin"];
    }
    if($opts["y_size"])
    {
    $opts["box_y_size"] = $img_y - $top_margin - 2 - $bottom_margin;
    }
    else
    {
    $opts["y_size"] = $top_margin + 2 + $opts["box_y_size"] + $bottom_margin;
    }

    $box_top = $top_margin+1;
    $box_bottom = $box_top + 2 + $opts["box_y_size"];
    $box_left = $left_margin+1;
    $box_right = $box_left + $opts["box_x_size"];
    $img = imagecreate($opts["x_size"]+1, $opts["y_size"]+1);
    list($r, $g, $b) = $opts["bg_color"];
    $bg_color = imagecolorallocate($img, $r, $g, $b);
    if($opts["bg_trans"])
    {
    imagecolortransparent($img, $bg_color);
    }
    list($r, $g, $b) = $opts["fg_color"];
    $fg_color = imagecolorallocate($img, $r, $g, $b);
    if(is_array($opts["val_color"]))
    {
    list($r, $g, $b) = $opts["val_color"];
    }
    $box_color = $fg_color;
    if(is_array($opts["box_color"]))
    {
    list($r, $g, $b) = $opts["box_color"];
    $box_color = imagecolorallocate($img, $r, $g, $b);
    }
    $bar_color = $fg_color;
    if(is_array($opts["bar_color"]))
    {
    list($r, $g, $b) = $opts["bar_color"];
    $bar_color = imagecolorallocate($img, $r, $g, $b);
    }
    $title_color = $fg_color;
    if(is_array($opts["title_color"]))
    {
    list($r, $g, $b) = $opts["title_color"];
    $title_color = imagecolorallocate($img, $r, $g, $b);
    }
    $val_color = $fg_color;
    if(is_array($opts["val_color"]))
    {
    list($r, $g, $b) = $opts["val_color"];
    $val_color = imagecolorallocate($img, $r, $g, $b);
    }
    imagerectangle($img, 0, 0, $opts["x_size"], $opts["y_size"], $box_color);
    imagerectangle($img, $box_left, $box_top, $box_right, $box_bottom, $box_color);
    $num_records = count($rows);
    # lets find the next item up.
    # find the maximal marker.

    $finder = $max_y;
    $multiple = 1;
    while($finder > 10)
    {
    $finder = $finder/10;
    $multiple *= 10;
    }
    $oldfinder =$finder;
    $finder = round($finder);
    if($finder < $oldfinder)
    {
    $finder++;
    }
    # ok, so we have UP to 10 marks.
    $num_marks = $finder;
    $max_y = $finder * $multiple;

    $xspan = ($opts["box_x_size"] - $num_records -1)/$num_records;
    $yspan = $opts["box_y_size"]/$num_marks;

    for($x=$num_marks;$x>=0;$x--)
    {
    if($opts["show_y_lines"])
    {
    imageline($img,
    $box_left, ($x*$yspan)+$top_margin+1,
    $box_right, ($x*$yspan)+$top_margin+1,
    $box_color);
    }
    if($opts["show_y_val"])
    {
    $text = ($num_marks - $x)*$multiple;
    imagestring($img, $opts["font"],
    $left_margin - strlen($text)*$x_mod*$font_x,
    ($x*$yspan)+$top_margin-($font_y/2)+2,
    $text, $box_color);
    }
    }
    if($opts["title"])
    {
    $txtlen = strlen($opts["title"]) * $font_x;
    $left = $opts["box_x_size"]/2 - $txtlen/2 + $left_margin +1;
    $top = $font_y * $y_mod / 3;
    imagestring($img, $opts["font"], $left, $top, $opts["title"], $title_color);
    }
    if($opts["y_title"])
    {
    $txtlen = strlen($opts["y_title"]) * $font_x;
    $left = $left_margin / 2 - $txtlen / 2;
    $top = $font_y * $y_mod / 3;
    imagestring($img, $opts["font"], $left, $top, $opts["y_title"], $title_color);
    }
    if($opts["x_title"])
    {
    $left = $left_margin;
    $top = $opts["box_y_size"] + $top_margin + $font_y * $y_mod / 3;
    if($opts["show_x_val"])
    {
    $top += $font_y * $y_mod;
    }
    if($opts["show_y_in_x"])
    {
    $top += $font_y * $y_mod;
    }
    imagestring($img, $opts["font"], $left, $top, $opts["x_title"], $title_color);
    }

    $x_pos = 0;
    foreach($rows as $idx => $row)
    {
    $y_value = $row;
    $x_value = $idx;
    if(is_array($row))
    {
    if($opts["y_val"] && array_key_exists($opts["y_val"], $row))
    {
    $y_value = $row[$opts["y_val"]];
    }
    else
    {
    foreach($row as $var => $val)
    {
    $y_value = $val;
    break;
    }
    }
    }
    if($opts["x_val"])
    {
    $x_value = $row[$opts["x_val"]];
    }
    if(!is_numeric($x_value))
    {
    $x_value = $x_pos;
    }
    $top = $box_bottom - $y_value * $yspan / $multiple;
    $left = $box_left + $xspan * $x_value + 1 + $x_value;
    $right = $left + $xspan - 1;
    imagefilledrectangle($img, $left, $top, $right, $box_bottom, $bar_color);

    $y_txt = $x_pos + 1;
    if($opts["x_val"])
    {
    if(array_key_exists($opts["x_val"], $row))
    {
    $y_txt = $row[$opts["x_val"]];
    }
    }
    $top = $box_bottom + $font_y * $y_mod / 5;
    $txt_left = $left + $xspan / 2 - strlen($y_txt) * $font_x / 2 + 2;
    imagestring($img, $opts["font"], $txt_left, $top, $y_txt, $val_color);
    if($opts["show_y_in_x"])
    {
    $top += $font_y * $y_mod;
    $txt_left = $left + $xspan / 2 - strlen($y_value) * $font_x / 2 + 2;
    imagestring($img, $opts["font"], $txt_left, $top, $y_value, $val_color);
    }
    $x_pos++;
    }
    if($opts["return"])
    {
    return($img);
    }
    switch(strtolower($opts["img_format"]))
    {
    case "png":
    Header("Content-Type: image/png");
    ImagePNG($img);
    break;
    case "jpg":
    case "jpeg":
    Header("Content-Type: image/jpeg");
    ImageJPEG($img);
    break;
    case "gif":
    Header("Content-Type: image/gif");
    ImageGIF($img);
    break;
    }
    ImageDestroy($img);
    return;
    }
    DISCLAIMER: The content provided in this article is not warranted or guaranteed by Developer Shed, Inc. The content provided is intended for entertainment and/or educational purposes in order to introduce to the reader key ideas, concepts, and/or product reviews. As such it is incumbent upon the reader to employ real-world tactics for security and implementation of best practices. We are not liable for any negative consequences that may result from implementing any information covered in our articles or tutorials. If this is a hardware review, it is not recommended to open and/or modify your hardware.

    More Counters Code Articles
    More By Codewalkers

    blog comments powered by Disqus

    COUNTERS CODE ARTICLES

    - TG Who's Online
    - Text Based Counter that formats output
    - Counter & visitor statistics
    - Server Uptime Statistics
    - Chris Dingman's Hit Tracker Script
    - Graph Maker Function
    - Simple userOnline class
    - Adv. Log file generator
    - Logwriter
    - time_left()
    - Basic Statistics
    - Easy Counter
    - countCodeLines
    - MySQL Counter
    - bandwidthmeter

    Developer Shed Affiliates

     



    © 2003-2013 by Developer Shed. All rights reserved. DS Cluster - Follow our Sitemap