From 84b2b0b7321f4588ccd952bd15cfeb91ac56cefc Mon Sep 17 00:00:00 2001 From: Rodolphe Quiedeville Date: Fri, 7 Nov 2003 13:29:04 +0000 Subject: [PATCH] Retour au code d'origine --- htdocs/includes/phplot/phplot.php | 4507 ++++++++++++++--------------- 1 file changed, 2228 insertions(+), 2279 deletions(-) diff --git a/htdocs/includes/phplot/phplot.php b/htdocs/includes/phplot/phplot.php index f0a37bc6e67..f78855ed908 100644 --- a/htdocs/includes/phplot/phplot.php +++ b/htdocs/includes/phplot/phplot.php @@ -14,407 +14,374 @@ side of the image. //Requires PHP 3.0.2 or later -class PHPlot -{ +class PHPlot{ - var $is_inline = 0; //0 = Sends headers, 1 = sends just raw image data - var $browser_cache = '1'; // 0 = Sends headers for browser to not cache the image, (i.e. 0 = don't let browser cache image) + var $is_inline = 0; //0 = Sends headers, 1 = sends just raw image data + var $browser_cache = '1'; // 0 = Sends headers for browser to not cache the image, (i.e. 0 = don't let browser cache image) // (only if is_inline = 0 also) - var $session_set = ''; //Do not change - var $scale_is_set = ''; //Do not change - var $draw_plot_area_background = ''; - - var $image_width; //Total Width in Pixels - var $image_height; //Total Height in Pixels - var $image_border_type = ''; //raised, plain, '' - var $x_left_margin; - var $y_top_margin; - var $x_right_margin; - var $y_bot_margin; - var $plot_area = array(5,5,600,400); - var $x_axis_position = 0; //Where to draw the X_axis (world coordinates) - var $y_axis_position = ''; //Leave blank for Y axis at left of plot. (world coord.) - var $xscale_type = 'linear'; //linear or log - var $yscale_type = 'linear'; - - //Use for multiple plots per image - var $print_image = 1; //Used for multiple charts per image. - - //Fonts - var $use_ttf = 0; //Use TTF fonts (1) or not (0) - var $font_path = './'; //To be added - var $font = './benjamingothic.ttf'; - - ///////////Fonts: Small/Generic - var $small_ttffont_size = 12; // - //non-ttf - var $small_font = 2; // fonts = 1,2,3,4 or 5 - var $small_font_width = 6.0; // width in pixels (2=6,3=8,4=8) - var $small_font_height = 8.0; // height in pixels (2=8,3=10,4=12) - - ////////// Fonts:Title - var $title_ttffont = './benjamingothic.ttf'; - var $title_ttffont_size = 14; - var $title_angle= 0; - //non-ttf - var $title_font = '4'; // fonts = 1,2,3,4,5 - - ////////////// Fonts:Axis - var $axis_ttffont = './benjamingothic.ttf'; - var $axis_ttffont_size = 8; - var $x_datalabel_angle = 0; - //non-ttf - var $axis_font = 2; - - ////////////////Fonts:Labels of Data - var $datalabel_font = '2'; - - //////////////// Fonts:Labels (Axis Titles) - var $x_label_ttffont = './benjamingothic.ttf'; - var $x_label_ttffont_size = '12'; - var $x_label_angle = '0'; - - var $y_label_ttffont = './benjamingothic.ttf'; - var $y_label_ttffont_size = '12'; - var $y_label_angle = 90; - var $y_label_width = ''; - - //Formats - var $file_format = 'png'; - var $file_name = ''; //For output to a file instead of stdout - - //Plot Colors - var $shading = 0; - var $color_array = 1; //1 = include small list - //2 = include large list - //array = define your own color translation. See rgb.inc.php and SetRGBArray - var $bg_color; - var $plot_bg_color; - var $grid_color; - var $light_grid_color; - var $tick_color; - var $title_color; - var $label_color; - var $text_color; - var $i_light = ''; - - //Data - var $data_type = 'text-data'; //text-data, data-data-error, data-data - var $plot_type= 'linepoints'; //bars, lines, linepoints, area, points, pie, thinbarline - var $line_width = 2; - var $line_style = array('solid','solid','solid','dashed','dashed','solid'); //Solid or dashed lines - - var $data_color = ''; //array('blue','green','yellow',array(0,0,0)); - var $data_border_color = ''; - - var $label_scale_position = '.5'; //1 = top, 0 = bottom - var $group_frac_width = '.7'; //value from 0 to 1 = width of bar - var $bar_width_adjust = '1'; //1 = bars of normal width, must be > 0 - - var $point_size = 10; - var $point_shape = 'diamond'; //rect,circle,diamond,triangle,dot,line,halfline - var $error_bar_shape = 'tee'; //tee, line - var $error_bar_size = 5; //right left size of tee - var $error_bar_line_width = ''; //If set then use it, else use $line_width for thickness - var $error_bar_color = ''; - var $data_values; - - var $plot_border_type = 'full'; //left, none, full - var $plot_area_width = ''; - var $number_x_points; - var $plot_min_x; // Max and min of the plot area - var $plot_max_x= ''; // Max and min of the plot area - var $plot_min_y= ''; // Max and min of the plot area - var $plot_max_y = ''; // Max and min of the plot area - var $min_y = ''; - var $max_y = ''; - var $max_x = 10; //Must not be = 0; - var $y_precision = '1'; - var $x_precision = '1'; - var $si_units = ''; - - //Labels - var $draw_data_labels = '0'; - var $legend = ''; //an array - var $legend_x_pos = ''; - var $legend_y_pos = ''; - var $title_txt = ""; - var $y_label_txt = ''; - var $x_label_txt = ""; - - //DataAxis Labels (on each axis) - var $y_grid_label_type = 'data'; //data, none, time, other - var $y_grid_label_pos = 'plotleft'; //plotleft, plotright, yaxis, both - var $x_grid_label_type = 'data'; //data, title, none, time, other - var $draw_x_data_labels = ''; // 0=false, 1=true, ""=let program decide - var $x_time_format = "%H:%m:%s"; //See http://www.php.net/manual/html/function.strftime.html - var $x_datalabel_maxlength = 10; - - //Tick Formatting - var $tick_length = '10'; //pixels: tick length from axis left/downward - //tick_length2 to be implemented - //var $tick_length2 = ''; //pixels: tick length from axis line rightward/upward - var $draw_vert_ticks = 1; //1 = draw ticks, 0 = don't draw ticks - var $num_vert_ticks = ''; - var $vert_tick_increment=''; //Set num_vert_ticks or vert_tick_increment, not both. - var $vert_tick_position = 'both'; //plotright=(right of plot only), plotleft=(left of plot only), - //both = (both left and right of plot), yaxis=(crosses y axis) - var $horiz_tick_increment=''; //Set num_horiz_ticks or horiz_tick_increment, not both. - var $num_horiz_ticks=''; - var $skip_top_tick = '0'; - var $skip_bottom_tick = '0'; - - //Grid Formatting - var $draw_x_grid = 0; - var $draw_y_grid = 1; - - - //BEGIN CODE - ////////////////////////////////////////////////////// - //Constructor: Setup Img pointer, Colors and Size of Image - function PHPlot($which_width=600,$which_height=400,$which_output_file="",$which_input_file="") { - - $this->SetRGBArray('2'); - $this->background_done = 0; //Set to 1 after background image first drawn - - if ($which_output_file != "") { $this->SetOutputFile($which_output_file); }; - - if ($which_input_file != "") { - $this->SetInputFile($which_input_file) ; - } else { - $this->SetImageArea($which_width, $which_height); - $this->InitImage(); - } - - if ( ($this->session_set == 1) && ($this->img == "") ) { //For sessions - //Do nothing - } else { - $this->SetDefaultColors(); - } - - $this->SetIndexColors(); - - } - - //Set up the image and colors - function InitImage() { - //if ($this->img) { - // ImageDestroy($this->img); - //} - $this->img = ImageCreate($this->image_width, $this->image_height); - return true; - } - - function SetBrowserCache($which_browser_cache) { //Submitted by Thiemo Nagel - $this->browser_cache = $which_browser_cache; - return true; - } - - function SetPrintImage($which_pi) { - $this->print_image = $which_pi; - return true; - } - - function SetIsInline($which_ii) { - $this->is_inline = $which_ii; - return true; - } - - function SetUseTTF($which_ttf) { - $this->use_ttf = $which_ttf; - return true; - } - - function SetTitleFontSize($which_tfs) { - //TTF - $this->title_ttffont_size = $which_tfs; //pt size - - //Non-TTF settings - if (($which_tfs > 5) && (!$this->use_ttf)) { - $this->DrawError('Non-TTF font size must be 1,2,3,4 or 5'); - return false; - } else { - $this->title_font = $which_tfs; - //$this->title_font_height = ImageFontHeight($which_tfs) // height in pixels - //$this->title_font_width = ImageFontWidth($which_tfs); // width in pixels - } - return true; - } - - function SetLineStyles($which_sls){ - $this->line_style = $which_sls; - return true; - } + var $session_set = ''; //Do not change + var $scale_is_set = ''; //Do not change + var $draw_plot_area_background = ''; - function SetLegend($which_leg){ - if (is_array($which_leg)) { - $this->legend = $which_leg; - return true; - } else { - $this->DrawError('Error: SetLegend argument must be an array'); - return false; - } - } + var $image_width; //Total Width in Pixels + var $image_height; //Total Height in Pixels + var $image_border_type = ''; //raised, plain, '' + var $x_left_margin; + var $y_top_margin; + var $x_right_margin; + var $y_bot_margin; + var $plot_area = array(5,5,600,400); + var $x_axis_position = 0; //Where to draw the X_axis (world coordinates) + var $y_axis_position = ''; //Leave blank for Y axis at left of plot. (world coord.) + var $xscale_type = 'linear'; //linear or log + var $yscale_type = 'linear'; - function SetLegendPixels($which_x,$which_y,$which_type) { - //which_type not yet used - $this->legend_x_pos = $which_x; - $this->legend_y_pos = $which_y; - return true; - } +//Use for multiple plots per image + var $print_image = 1; //Used for multiple charts per image. - function SetLegendWorld($which_x,$which_y,$which_type='') { - //which_type not yet used - //Must be called after scales are set up. - if ($this->scale_is_set != 1) { $this->SetTranslation(); }; - $this->legend_x_pos = $this->xtr($which_x); - $this->legend_y_pos = $this->ytr($which_y); - return true; - } -/* *************************************** - function SetFileFormat($which_file_format) { //Only works with PHP4 - $asked = strtolower($which_file_format); - if( $asked =="jpg" || $asked =="png" || $asked =="gif" || $asked =="wbmp" ) { - if( $asked=="jpg" && !(imagetypes() & IMG_JPG) ) - return false; - elseif( $asked=="png" && !(imagetypes() & IMG_PNG) ) - return false; - elseif( $asked=="gif" && !(imagetypes() & IMG_GIF) ) - return false; - elseif( $asked=="wbmp" && !(imagetypes() & IMG_WBMP) ) - return false; - else { - $this->img_format=$asked; - return true; - } - } - else - return false; - } +//Fonts + var $use_ttf = 0; //Use TTF fonts (1) or not (0) + var $font_path = './'; //To be added + var $font = './benjamingothic.ttf'; - *************************************** */ - function SetFileFormat($which_file_format) { - //eventually test to see if that is supported - if not then return false - $asked = strtolower(trim($which_file_format)); - if( ($asked=='jpg') || ($asked=='png') || ($asked=='gif') || ($asked=='wbmp') ) { - $this->file_format = $asked; - return true; - } else { - return false; - } - } - - function SetInputFile($which_input_file) { - //$this->SetFileFormat($which_frmt); - $size = GetImageSize($which_input_file); - $input_type = $size[2]; - - switch($input_type) { //After SetFileFormat is in lower case - case "1": - $im = @ImageCreateFromGIF ($which_input_file); - if (!$im) { // See if it failed - $this->PrintError("Unable to open $which_input_file as a GIF"); - return false; - } - break; - case "3": - $im = @ImageCreateFromPNG ($which_input_file); - if (!$im) { // See if it failed - $this->PrintError("Unable to open $which_input_file as a PNG"); - return false; - } - break; - case "2": - $im = @ImageCreateFromJPEG ($which_input_file); - if (!$im) { // See if it failed - $this->PrintError("Unable to open $which_input_file as a JPG"); - return false; - } - break; - default: - $this->PrintError('Please select wbmp,gif,jpg, or png for image type!'); - return false; - break; - } - - //Get Width and Height of Image - $this->SetImageArea($size[0],$size[1]); - - $this->img = $im; - - return true; - - } + ///////////Fonts: Small/Generic + var $small_ttffont_size = 12; // + //non-ttf + var $small_font = 2; // fonts = 1,2,3,4 or 5 + var $small_font_width = 6.0; // width in pixels (2=6,3=8,4=8) + var $small_font_height = 8.0; // height in pixels (2=8,3=10,4=12) - function SetOutputFile($which_output_file) - { - $this->output_file = $which_output_file; - return true; - } - - function SetImageArea($which_iw,$which_ih) { - //Note this is now an Internal function - please set w/h via PHPlot() - $this->image_width = $which_iw; - $this->image_height = $which_ih; - - return true; - } - - function SetYAxisPosition($which_pos) - { - $this->y_axis_position = $which_pos; - return true; - } - - function SetXAxisPosition($which_pos) - { - $this->x_axis_position = $which_pos; - return true; - } - - function SetXTimeFormat($which_xtf) - { - $this->x_time_format = $which_xtf; - return true; - } - - function SetXDataLabelMaxlength($which_xdlm) { - if ($which_xdlm >0 ) { - $this->x_datalabel_maxlength = $which_xdlm; - return true; - } else { - return false; - } - } + ////////// Fonts:Title + var $title_ttffont = './benjamingothic.ttf'; + var $title_ttffont_size = 14; + var $title_angle= 0; + //non-ttf + var $title_font = '4'; // fonts = 1,2,3,4,5 - function SetXDataLabelAngle($which_xdla) { - $this->x_datalabel_angle = $which_xdla; - return true; - } + ////////////// Fonts:Axis + var $axis_ttffont = './benjamingothic.ttf'; + var $axis_ttffont_size = 8; + var $x_datalabel_angle = 0; + //non-ttf + var $axis_font = 2; - function SetXScaleType($which_xst) { - $this->xscale_type = $which_xst; - return true; - } - - function SetYScaleType($which_yst) { - $this->yscale_type = $which_yst; - if ($this->x_axis_position <= 0) { - $this->x_axis_position = 1; - } - return true; - } - - function SetPrecisionX($which_prec) { - $this->x_precision = $which_prec; - return true; - } + ////////////////Fonts:Labels of Data + var $datalabel_font = '2'; - function SetPrecisionY($which_prec) - { - $this->y_precision = $which_prec; - return true; - } + //////////////// Fonts:Labels (Axis Titles) + var $x_label_ttffont = './benjamingothic.ttf'; + var $x_label_ttffont_size = '12'; + var $x_label_angle = '0'; + + var $y_label_ttffont = './benjamingothic.ttf'; + var $y_label_ttffont_size = '12'; + var $y_label_angle = 90; + var $y_label_width = ''; + +//Formats + var $file_format = 'png'; + var $file_name = ''; //For output to a file instead of stdout + +//Plot Colors + var $shading = 0; + var $color_array = 1; //1 = include small list + //2 = include large list + //array = define your own color translation. See rgb.inc.php and SetRGBArray + var $bg_color; + var $plot_bg_color; + var $grid_color; + var $light_grid_color; + var $tick_color; + var $title_color; + var $label_color; + var $text_color; + var $i_light = ''; + +//Data + var $data_type = 'text-data'; //text-data, data-data-error, data-data + var $plot_type= 'linepoints'; //bars, lines, linepoints, area, points, pie, thinbarline + var $line_width = 2; + var $line_style = array('solid','solid','solid','dashed','dashed','solid'); //Solid or dashed lines + + var $data_color = ''; //array('blue','green','yellow',array(0,0,0)); + var $data_border_color = ''; + + var $label_scale_position = '.5'; //1 = top, 0 = bottom + var $group_frac_width = '.7'; //value from 0 to 1 = width of bar + var $bar_width_adjust = '1'; //1 = bars of normal width, must be > 0 + + var $point_size = 10; + var $point_shape = 'diamond'; //rect,circle,diamond,triangle,dot,line,halfline + var $error_bar_shape = 'tee'; //tee, line + var $error_bar_size = 5; //right left size of tee + var $error_bar_line_width = ''; //If set then use it, else use $line_width for thickness + var $error_bar_color = ''; + var $data_values; + + var $plot_border_type = 'full'; //left, none, full + var $plot_area_width = ''; + var $number_x_points; + var $plot_min_x; // Max and min of the plot area + var $plot_max_x= ''; // Max and min of the plot area + var $plot_min_y= ''; // Max and min of the plot area + var $plot_max_y = ''; // Max and min of the plot area + var $min_y = ''; + var $max_y = ''; + var $max_x = 10; //Must not be = 0; + var $y_precision = '1'; + var $x_precision = '1'; + var $si_units = ''; + +//Labels + var $draw_data_labels = '0'; + var $legend = ''; //an array + var $legend_x_pos = ''; + var $legend_y_pos = ''; + var $title_txt = ""; + var $y_label_txt = ''; + var $x_label_txt = ""; + +//DataAxis Labels (on each axis) + var $y_grid_label_type = 'data'; //data, none, time, other + var $y_grid_label_pos = 'plotleft'; //plotleft, plotright, yaxis, both + var $x_grid_label_type = 'data'; //data, title, none, time, other + var $draw_x_data_labels = ''; // 0=false, 1=true, ""=let program decide + var $x_time_format = "%H:%m:%s"; //See http://www.php.net/manual/html/function.strftime.html + var $x_datalabel_maxlength = 10; + +//Tick Formatting + var $tick_length = '10'; //pixels: tick length from axis left/downward + //tick_length2 to be implemented + //var $tick_length2 = ''; //pixels: tick length from axis line rightward/upward + var $draw_vert_ticks = 1; //1 = draw ticks, 0 = don't draw ticks + var $num_vert_ticks = ''; + var $vert_tick_increment=''; //Set num_vert_ticks or vert_tick_increment, not both. + var $vert_tick_position = 'both'; //plotright=(right of plot only), plotleft=(left of plot only), + //both = (both left and right of plot), yaxis=(crosses y axis) + var $horiz_tick_increment=''; //Set num_horiz_ticks or horiz_tick_increment, not both. + var $num_horiz_ticks=''; + var $skip_top_tick = '0'; + var $skip_bottom_tick = '0'; + +//Grid Formatting + var $draw_x_grid = 0; + var $draw_y_grid = 1; + + +//BEGIN CODE +////////////////////////////////////////////////////// + //Constructor: Setup Img pointer, Colors and Size of Image + function PHPlot($which_width=600,$which_height=400,$which_output_file="",$which_input_file="") { + + $this->SetRGBArray('2'); + $this->background_done = 0; //Set to 1 after background image first drawn + + if ($which_output_file != "") { $this->SetOutputFile($which_output_file); }; + + if ($which_input_file != "") { + $this->SetInputFile($which_input_file) ; + } else { + $this->SetImageArea($which_width, $which_height); + $this->InitImage(); + } + + if ( ($this->session_set == 1) && ($this->img == "") ) { //For sessions + //Do nothing + } else { + $this->SetDefaultColors(); + } + + $this->SetIndexColors(); + + } + + //Set up the image and colors + function InitImage() { + //if ($this->img) { + // ImageDestroy($this->img); + //} + $this->img = ImageCreate($this->image_width, $this->image_height); + return true; + } + + function SetBrowserCache($which_browser_cache) { //Submitted by Thiemo Nagel + $this->browser_cache = $which_browser_cache; + return true; + } + + function SetPrintImage($which_pi) { + $this->print_image = $which_pi; + return true; + } + + function SetIsInline($which_ii) { + $this->is_inline = $which_ii; + return true; + } + + function SetUseTTF($which_ttf) { + $this->use_ttf = $which_ttf; + return true; + } + + function SetTitleFontSize($which_tfs) { + //TTF + $this->title_ttffont_size = $which_tfs; //pt size + + //Non-TTF settings + if (($which_tfs > 5) && (!$this->use_ttf)) { + $this->DrawError('Non-TTF font size must be 1,2,3,4 or 5'); + return false; + } else { + $this->title_font = $which_tfs; + //$this->title_font_height = ImageFontHeight($which_tfs) // height in pixels + //$this->title_font_width = ImageFontWidth($which_tfs); // width in pixels + } + return true; + } + + function SetLineStyles($which_sls){ + $this->line_style = $which_sls; + return true; + } + + function SetLegend($which_leg){ + if (is_array($which_leg)) { + $this->legend = $which_leg; + return true; + } else { + $this->DrawError('Error: SetLegend argument must be an array'); + return false; + } + } + + function SetLegendPixels($which_x,$which_y,$which_type) { + //which_type not yet used + $this->legend_x_pos = $which_x; + $this->legend_y_pos = $which_y; + return true; + } + + function SetLegendWorld($which_x,$which_y,$which_type='') { + //which_type not yet used + //Must be called after scales are set up. + if ($this->scale_is_set != 1) { $this->SetTranslation(); }; + $this->legend_x_pos = $this->xtr($which_x); + $this->legend_y_pos = $this->ytr($which_y); + return true; + } + + function SetFileFormat($which_file_format) { + //eventually test to see if that is supported - if not then return false + $asked = strtolower(trim($which_file_format)); + if( ($asked=='jpg') || ($asked=='png') || ($asked=='gif') || ($asked=='wbmp') ) { + $this->file_format = $asked; + return true; + } else { + return false; + } + } + + function SetInputFile($which_input_file) { + //$this->SetFileFormat($which_frmt); + $size = GetImageSize($which_input_file); + $input_type = $size[2]; + + switch($input_type) { //After SetFileFormat is in lower case + case "1": + $im = @ImageCreateFromGIF ($which_input_file); + if (!$im) { // See if it failed + $this->PrintError("Unable to open $which_input_file as a GIF"); + return false; + } + break; + case "3": + $im = @ImageCreateFromPNG ($which_input_file); + if (!$im) { // See if it failed + $this->PrintError("Unable to open $which_input_file as a PNG"); + return false; + } + break; + case "2": + $im = @ImageCreateFromJPEG ($which_input_file); + if (!$im) { // See if it failed + $this->PrintError("Unable to open $which_input_file as a JPG"); + return false; + } + break; + default: + $this->PrintError('Please select wbmp,gif,jpg, or png for image type!'); + return false; + break; + } + + //Get Width and Height of Image + $this->SetImageArea($size[0],$size[1]); + + $this->img = $im; + + return true; + + } + + function SetOutputFile($which_output_file) { + $this->output_file = $which_output_file; + return true; + } + + function SetImageArea($which_iw,$which_ih) { + //Note this is now an Internal function - please set w/h via PHPlot() + $this->image_width = $which_iw; + $this->image_height = $which_ih; + + return true; + } + + + function SetYAxisPosition($which_pos) { + $this->y_axis_position = $which_pos; + return true; + } + function SetXAxisPosition($which_pos) { + $this->x_axis_position = $which_pos; + return true; + } + function SetXTimeFormat($which_xtf) { + $this->x_time_format = $which_xtf; + return true; + } + function SetXDataLabelMaxlength($which_xdlm) { + if ($which_xdlm >0 ) { + $this->x_datalabel_maxlength = $which_xdlm; + return true; + } else { + return false; + } + } + function SetXDataLabelAngle($which_xdla) { + $this->x_datalabel_angle = $which_xdla; + return true; + } + function SetXScaleType($which_xst) { + $this->xscale_type = $which_xst; + return true; + } + function SetYScaleType($which_yst) { + $this->yscale_type = $which_yst; + if ($this->x_axis_position <= 0) { + $this->x_axis_position = 1; + } + return true; + } + + function SetPrecisionX($which_prec) { + $this->x_precision = $which_prec; + return true; + } + function SetPrecisionY($which_prec) { + $this->y_precision = $which_prec; + return true; + } function SetIndexColors() { //Internal Method called to set colors and preserve state @@ -459,110 +426,109 @@ class PHPlot } - function SetDefaultColors() - { - $this->i_light = array(194,194,194); - $this->i_dark = array(100,100,100); - $this->SetPlotBgColor(array(222,222,222)); - $this->SetBackgroundColor(array(200,222,222)); //can use rgb values or "name" values - $this->SetLabelColor('black'); - $this->SetTextColor('black'); - $this->SetGridColor('black'); - $this->SetLightGridColor(array(175,175,175)); - $this->SetTickColor('black'); - $this->SetTitleColor(array(0,0,0)); // Can be array or name - $this->data_color = array('green','blue','yellow','red','orange'); - $this->error_bar_color = array('blue','green','yellow','red','orange'); - $this->data_border_color = array('black'); + function SetDefaultColors() { - $this->session_set = 1; //Mark it down for PHP session() usage. - } + $this->i_light = array(194,194,194); + $this->i_dark = array(100,100,100); + $this->SetPlotBgColor(array(222,222,222)); + $this->SetBackgroundColor(array(200,222,222)); //can use rgb values or "name" values + $this->SetLabelColor('black'); + $this->SetTextColor('black'); + $this->SetGridColor('black'); + $this->SetLightGridColor(array(175,175,175)); + $this->SetTickColor('black'); + $this->SetTitleColor(array(0,0,0)); // Can be array or name + $this->data_color = array('blue','green','yellow','red','orange'); + $this->error_bar_color = array('blue','green','yellow','red','orange'); + $this->data_border_color = array('black'); - function PrintImage() - { + $this->session_set = 1; //Mark it down for PHP session() usage. + } - if ( ($this->browser_cache == 0) && ($this->is_inline == 0)) { //Submitted by Thiemo Nagel - header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); - header('Last-Modified: ' . gmdate("D, d M Y H:i:s") . 'GMT'); - header('Cache-Control: no-cache, must-revalidate'); - header('Pragma: no-cache'); - } + function PrintImage() { - switch($this->file_format) { - case "png": - if ($this->is_inline == 0) { - Header('Content-type: image/png'); - } - if ($this->is_inline == 1 && $this->output_file != "") { - ImagePng($this->img,$this->output_file); - } else { - ImagePng($this->img); - } - break; - case "jpg": - if ($this->is_inline == 0) { - Header('Content-type: image/jpeg'); - } - if ($this->is_inline == 1 && $this->output_file != "") { - ImageJPEG($this->img,$this->output_file); - } else { - ImageJPEG($this->img); - } - break; - case "gif": - if ($this->is_inline == 0) { - Header('Content-type: image/gif'); - } - if ($this->is_inline == 1 && $this->output_file != "") { - ImageGIF($this->img,$this->output_file); - } else { - ImageGIF($this->img); - } - - break; - case "wbmp": - if ($this->is_inline == 0) { - Header('Content-type: image/wbmp'); - } - if ($this->is_inline == 1 && $this->output_file != "") { - ImageWBMP($this->img,$this->output_file); - } else { - ImageWBMP($this->img); - } - - break; - default: - $this->PrintError('Please select an image type!
'); - break; - } - ImageDestroy($this->img); - return true; - } + if ( ($this->browser_cache == 0) && ($this->is_inline == 0)) { //Submitted by Thiemo Nagel + header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); + header('Last-Modified: ' . gmdate("D, d M Y H:i:s") . 'GMT'); + header('Cache-Control: no-cache, must-revalidate'); + header('Pragma: no-cache'); + } + + switch($this->file_format) { + case "png": + if ($this->is_inline == 0) { + Header('Content-type: image/png'); + } + if ($this->is_inline == 1 && $this->output_file != "") { + ImagePng($this->img,$this->output_file); + } else { + ImagePng($this->img); + } + break; + case "jpg": + if ($this->is_inline == 0) { + Header('Content-type: image/jpeg'); + } + if ($this->is_inline == 1 && $this->output_file != "") { + ImageJPEG($this->img,$this->output_file); + } else { + ImageJPEG($this->img); + } + break; + case "gif": + if ($this->is_inline == 0) { + Header('Content-type: image/gif'); + } + if ($this->is_inline == 1 && $this->output_file != "") { + ImageGIF($this->img,$this->output_file); + } else { + ImageGIF($this->img); + } + + break; + case "wbmp": + if ($this->is_inline == 0) { + Header('Content-type: image/wbmp'); + } + if ($this->is_inline == 1 && $this->output_file != "") { + ImageWBMP($this->img,$this->output_file); + } else { + ImageWBMP($this->img); + } + + break; + default: + $this->PrintError('Please select an image type!
'); + break; + } + ImageDestroy($this->img); + return true; + } - function DrawBackground() { - //if ($this->img == "") { $this->InitImage(); }; - if ($this->background_done == 0) { //Don't draw it twice if drawing two plots on one image - ImageFilledRectangle($this->img, 0, 0, - $this->image_width, $this->image_height, $this->ndx_bg_color); - $this->background_done = 1; - } - return true; - } - - function DrawImageBorder() { - switch ($this->image_border_type) { - case "raised": - ImageLine($this->img,0,0,$this->image_width-1,0,$this->ndx_i_light); - ImageLine($this->img,1,1,$this->image_width-2,1,$this->ndx_i_light); - ImageLine($this->img,0,0,0,$this->image_height-1,$this->ndx_i_light); - ImageLine($this->img,1,1,1,$this->image_height-2,$this->ndx_i_light); - ImageLine($this->img,$this->image_width-1,0,$this->image_width-1,$this->image_height-1,$this->ndx_i_dark); - ImageLine($this->img,0,$this->image_height-1,$this->image_width-1,$this->image_height-1,$this->ndx_i_dark); - ImageLine($this->img,$this->image_width-2,1,$this->image_width-2,$this->image_height-2,$this->ndx_i_dark); - ImageLine($this->img,1,$this->image_height-2,$this->image_width-2,$this->image_height-2,$this->ndx_i_dark); - break; - case "plain": + function DrawBackground() { + //if ($this->img == "") { $this->InitImage(); }; + if ($this->background_done == 0) { //Don't draw it twice if drawing two plots on one image + ImageFilledRectangle($this->img, 0, 0, + $this->image_width, $this->image_height, $this->ndx_bg_color); + $this->background_done = 1; + } + return true; + } + + function DrawImageBorder() { + switch ($this->image_border_type) { + case "raised": + ImageLine($this->img,0,0,$this->image_width-1,0,$this->ndx_i_light); + ImageLine($this->img,1,1,$this->image_width-2,1,$this->ndx_i_light); + ImageLine($this->img,0,0,0,$this->image_height-1,$this->ndx_i_light); + ImageLine($this->img,1,1,1,$this->image_height-2,$this->ndx_i_light); + ImageLine($this->img,$this->image_width-1,0,$this->image_width-1,$this->image_height-1,$this->ndx_i_dark); + ImageLine($this->img,0,$this->image_height-1,$this->image_width-1,$this->image_height-1,$this->ndx_i_dark); + ImageLine($this->img,$this->image_width-2,1,$this->image_width-2,$this->image_height-2,$this->ndx_i_dark); + ImageLine($this->img,1,$this->image_height-2,$this->image_width-2,$this->image_height-2,$this->ndx_i_dark); + break; + case "plain": ImageLine($this->img,0,0,$this->image_width,0,$this->ndx_i_dark); ImageLine($this->img,$this->image_width-1,0,$this->image_width-1,$this->image_height,$this->ndx_i_dark); ImageLine($this->img,$this->image_width-1,$this->image_height-1,0,$this->image_height-1,$this->ndx_i_dark); @@ -624,13 +590,6 @@ class PHPlot $this->title_txt = $title; return true; } - - //function SetLabels($xlbl,$ylbl,$title) { - // $this->title_txt = $title; - // $this->x_label_txt = $xlbl; - // $this->y_label_txt = $ylbl; - //} - function DrawLabels() { $this->DrawTitle(); $this->DrawXLabel(); @@ -645,7 +604,7 @@ class PHPlot $this->DrawText($this->x_label_ttffont, $this->x_label_angle, $xpos, $ypos, $this->ndx_label_color, $this->x_label_ttffont_size, $this->x_label_txt,'center'); } else { - //$xpos = 0.0 - (ImageFontWidth($this->small_font)*strlen($this->x_label_txt)/2.0) + $this->xtr(($this->plot_max_x+$this->plot_min_x)/2.0) ; + $xpos = 0.0 + $this->xtr(($this->plot_max_x+$this->plot_min_x)/2.0) ; $ypos = ($this->ytr($this->plot_min_y) + $this->x_label_height/2); @@ -791,271 +750,275 @@ class PHPlot return true; } - function SetPlotType($which_pt) + function SetPlotType($which_pt) { + $accepted = "bars,lines,linepoints,area,points,pie,thinbarline"; + $asked = trim($which_pt); + if (eregi($asked, $accepted)) { + $this->plot_type = $which_pt; + return true; + } else { + $this->DrawError('$which_pt not an acceptable plot type'); + return false; + } + } + + function FindDataLimits() { + //Text-Data is different than data-data graphs. For them what + // we have, instead of X values, is # of records equally spaced on data. + //text-data is passed in as $data[] = (title,y1,y2,y3,y4,...) + //data-data is passed in as $data[] = (title,x,y1,y2,y3,y4,...) + + $this->number_x_points = count($this->data_values); + + switch ($this->data_type) { + case "text-data": + $minx = 0; //valid for BAR TYPE GRAPHS ONLY + $maxx = $this->number_x_points - 1 ; //valid for BAR TYPE GRAPHS ONLY + $miny = (double) $this->data_values[0][1]; + $maxy = $miny; + if ($this->draw_x_data_labels == "") { + $this->draw_x_data_labels = 1; //labels_note1: prevent both data labels and x-axis labels being both drawn and overlapping + } + break; + default: //Everything else: data-data, etc. + $maxx = $this->data_values[0][1]; + $minx = $maxx; + $miny = $this->data_values[0][2]; + $maxy = $miny; + $maxy = $miny; + break; + } + + $max_records_per_group = 0; + $total_records = 0; + $mine = 0; //Maximum value for the -error bar (assume error bars always > 0) + $maxe = 0; //Maximum value for the +error bar (assume error bars always > 0) + + reset($this->data_values); + while (list($dat_key, $dat) = each($this->data_values)) { //for each X barchart setting + //foreach($this->data_values as $dat) //can use foreach only in php4 + + $tmp = 0; + $total_records += count($dat) - 1; // -1 for label + + switch ($this->data_type) { + case "text-data": + //Find the relative Max and Min + + while (list($key, $val) = each($dat)) { + if ($key != 0) { //$dat[0] = label + SetType($val,"double"); + if ($val > $maxy) { + $maxy = $val ; + } + if ($val < $miny) { + $miny = (double) $val ; + } + } + $tmp++; + } + break; + case "data-data": //X-Y data is passed in as $data[] = (title,x,y,y2,y3,...) which you can use for multi-dimentional plots. + + while (list($key, $val) = each($dat)) { + if ($key == 1) { //$dat[0] = label + SetType($val,"double"); + if ($val > $maxx) { + $maxx = $val; + } elseif ($val < $minx) { + $minx = $val; + } + } elseif ($key > 1) { + SetType($val,"double"); + if ($val > $maxy) { + $maxy = $val ; + } elseif ($val < $miny) { + $miny = $val ; + } + } + $tmp++; + } + $tmp = $tmp - 1; //# records per group + break; + case "data-data-error": //Assume 2-D for now, can go higher + //Regular X-Y data is passed in as $data[] = (title,x,y,error+,error-,y2,error2+,error2-) + + while (list($key, $val) = each($dat)) { + if ($key == 1) { //$dat[0] = label + SetType($val,'double'); + if ($val > $maxx) { + $maxx = $val; + } elseif ($val < $minx) { + $minx = $val; + } + } elseif ($key%3 == 2) { + SetType($val,'double'); + if ($val > $maxy) { + $maxy = $val ; + } elseif ($val < $miny) { + $miny = $val ; + } + } elseif ($key%3 == 0) { + SetType($val,'double'); + if ($val > $maxe) { + $maxe = $val ; + } + } elseif ($key%3 == 1) { + SetType($val,'double'); + if ($val > $mine) { + $mine = $val ; + } + } + $tmp++; + } + $maxy = $maxy + $maxe; + $miny = $miny - $mine; //assume error bars are always > 0 + + break; + default: + $this->PrintError('ERROR: unknown chart type'); + break; + } + if ($tmp > $max_records_per_group) { + $max_records_per_group = $tmp; + } + } + + + $this->min_x = $minx; + $this->max_x = $maxx; + $this->min_y = $miny; + $this->max_y = $maxy; + + + if ($max_records_per_group > 1) { + $this->records_per_group = $max_records_per_group - 1; + } else { + $this->records_per_group = 1; + } + + + //$this->data_count = $total_records ; + } // function FindDataLimits + + function SetMargins() { + ///////////////////////////////////////////////////////////////// + // When the image is first created - set the margins + // to be the standard viewport. + // The standard viewport is the full area of the view surface (or panel), + // less a margin of 4 character heights all round for labelling. + // It thus depends on the current character size, set by SetCharacterHeight(). + ///////////////////////////////////////////////////////////////// + + $str = split("\n",$this->title_txt); + $nbLines = count($str); + + if ($this->use_ttf == 1) { + $title_size = $this->TTFBBoxSize($this->title_ttffont_size, $this->title_angle, $this->title_ttffont, 'X'); //An array + if ($nbLines == 1) { + $this->y_top_margin = $title_size[1] * 4; + } else { + $this->y_top_margin = $title_size[1] * ($nbLines+3); + } + + //ajo working here + //$x_label_size = $this->TTFBBoxSize($this->x_label_ttffont_size, 0, $this->axis_ttffont, $this->x_label_txt); + + $this->y_bot_margin = $this->x_label_height ; + $this->x_left_margin = $this->y_label_width * 2 + $this->tick_length; + $this->x_right_margin = 33.0; // distance between right and end of x axis in pixels + } else { + $title_size = array(ImageFontWidth($this->title_font) * strlen($this->title_txt),ImageFontHeight($this->title_font)); + //$this->y_top_margin = ($title_size[1] * 4); + if ($nbLines == 1) { + $this->y_top_margin = $title_size[1] * 4; + } else { + $this->y_top_margin = $title_size[1] * ($nbLines+3); + } + if ($this->x_datalabel_angle == 90) { + $this->y_bot_margin = 76.0; // Must be integer + } else { + $this->y_bot_margin = 66.0; // Must be integer + } + $this->x_left_margin = 77.0; // distance between left and start of x axis in pixels + $this->x_right_margin = 33.0; // distance between right and end of x axis in pixels + } + +//exit; + $this->x_tot_margin = $this->x_left_margin + $this->x_right_margin; + $this->y_tot_margin = $this->y_top_margin + $this->y_bot_margin; + + if ($this->plot_max_x && $this->plot_max_y && $this->plot_area_width ) { //If data has already been analysed then set translation + $this->SetTranslation(); + } + } + + function SetMarginsPixels($which_lm,$which_rm,$which_tm,$which_bm) { + //Set the plot area using margins in pixels (left, right, top, bottom) + $this->SetNewPlotAreaPixels($which_lm,$which_tm,($this->image_width - $which_rm),($this->image_height - $which_bm)); + return true; + } + + function SetNewPlotAreaPixels($x1,$y1,$x2,$y2) { + //Like in GD 0,0 is upper left set via pixel Coordinates + $this->plot_area = array($x1,$y1,$x2,$y2); + $this->plot_area_width = $this->plot_area[2] - $this->plot_area[0]; + $this->plot_area_height = $this->plot_area[3] - $this->plot_area[1]; + $this->y_top_margin = $this->plot_area[1]; + if ($this->plot_max_x) { + $this->SetTranslation(); + } + return true; + } + + function SetPlotAreaPixels($x1,$y1,$x2,$y2) { + //Like in GD 0,0 is upper left + if (!$this->x_tot_margin) { + $this->SetMargins(); + } + if ($x2 && $y2) { + $this->plot_area = array($x1,$y1,$x2,$y2); + } else { + $this->plot_area = array($this->x_left_margin, $this->y_top_margin, + $this->image_width - $this->x_right_margin, + $this->image_height - $this->y_bot_margin + ); + } + $this->plot_area_width = $this->plot_area[2] - $this->plot_area[0]; + $this->plot_area_height = $this->plot_area[3] - $this->plot_area[1]; + + return true; + + } + + function SetPlotAreaWorld($xmin,$ymin,$xmax,$ymax) { - $accepted = "bars,lines,linepoints,area,points,pie,thinbarline"; - $asked = trim($which_pt); - if (eregi($asked, $accepted)) { - $this->plot_type = $which_pt; - return true; - } else { - $this->DrawError('$which_pt not an acceptable plot type'); - return false; - } - } - - function FindDataLimits() { - //Text-Data is different than data-data graphs. For them what - // we have, instead of X values, is # of records equally spaced on data. - //text-data is passed in as $data[] = (title,y1,y2,y3,y4,...) - //data-data is passed in as $data[] = (title,x,y1,y2,y3,y4,...) - - $this->number_x_points = count($this->data_values); - - switch ($this->data_type) { - case "text-data": - $minx = 0; //valid for BAR TYPE GRAPHS ONLY - $maxx = $this->number_x_points - 1 ; //valid for BAR TYPE GRAPHS ONLY - $miny = (double) $this->data_values[0][1]; - $maxy = $miny; - if ($this->draw_x_data_labels == "") { - $this->draw_x_data_labels = 1; //labels_note1: prevent both data labels and x-axis labels being both drawn and overlapping - } - break; - default: //Everything else: data-data, etc. - $maxx = $this->data_values[0][1]; - $minx = $maxx; - $miny = $this->data_values[0][2]; - $maxy = $miny; - $maxy = $miny; - break; - } - - $max_records_per_group = 0; - $total_records = 0; - $mine = 0; //Maximum value for the -error bar (assume error bars always > 0) - $maxe = 0; //Maximum value for the +error bar (assume error bars always > 0) - - reset($this->data_values); - while (list($dat_key, $dat) = each($this->data_values)) { //for each X barchart setting - //foreach($this->data_values as $dat) //can use foreach only in php4 - - $tmp = 0; - $total_records += count($dat) - 1; // -1 for label - - switch ($this->data_type) { - case "text-data": - //Find the relative Max and Min - - while (list($key, $val) = each($dat)) { - if ($key != 0) { //$dat[0] = label - SetType($val,"double"); - if ($val > $maxy) { - $maxy = $val ; - } - if ($val < $miny) { - $miny = (double) $val ; - } + if (($xmin == "") && ($xmax == "")) + { + //For automatic setting of data we need $this->max_x + if (!$this->max_y) + { + $this->FindDataLimits() ; } - $tmp++; + if ($this->data_type == 'text-data') { //labels for text-data is done at data drawing time for speed. + $xmax = $this->max_x + 1 ; //valid for BAR CHART TYPE GRAPHS ONLY + $xmin = 0 ; //valid for BAR CHART TYPE GRAPHS ONLY + } else { + $xmax = $this->max_x * 1.02; + $xmin = $this->min_x; } - break; - case "data-data": //X-Y data is passed in as $data[] = (title,x,y,y2,y3,...) which you can use for multi-dimentional plots. - - while (list($key, $val) = each($dat)) { - if ($key == 1) { //$dat[0] = label - SetType($val,"double"); - if ($val > $maxx) { - $maxx = $val; - } elseif ($val < $minx) { - $minx = $val; - } - } elseif ($key > 1) { - SetType($val,"double"); - if ($val > $maxy) { - $maxy = $val ; - } elseif ($val < $miny) { - $miny = $val ; - } - } - $tmp++; - } - $tmp = $tmp - 1; //# records per group - break; - case "data-data-error": //Assume 2-D for now, can go higher - //Regular X-Y data is passed in as $data[] = (title,x,y,error+,error-,y2,error2+,error2-) - while (list($key, $val) = each($dat)) { - if ($key == 1) { //$dat[0] = label - SetType($val,'double'); - if ($val > $maxx) { - $maxx = $val; - } elseif ($val < $minx) { - $minx = $val; - } - } elseif ($key%3 == 2) { - SetType($val,'double'); - if ($val > $maxy) { - $maxy = $val ; - } elseif ($val < $miny) { - $miny = $val ; - } - } elseif ($key%3 == 0) { - SetType($val,'double'); - if ($val > $maxe) { - $maxe = $val ; - } - } elseif ($key%3 == 1) { - SetType($val,'double'); - if ($val > $mine) { - $mine = $val ; - } - } - $tmp++; + $ymax = ceil($this->max_y * 1.2); + if ($this->min_y < 0) { + $ymin = floor($this->min_y * 1.2); + } else { + $ymin = 0; } - $maxy = $maxy + $maxe; - $miny = $miny - $mine; //assume error bars are always > 0 - - break; - default: - $this->PrintError('ERROR: unknown chart type'); - break; } - if ($tmp > $max_records_per_group) { - $max_records_per_group = $tmp; - } - } - - $this->min_x = $minx; - $this->max_x = $maxx; - $this->min_y = $miny; - $this->max_y = $maxy; - - if ($max_records_per_group > 1) { - $this->records_per_group = $max_records_per_group - 1; - } else { - $this->records_per_group = 1; - } - - - //$this->data_count = $total_records ; - } // function FindDataLimits - - function SetMargins() { - ///////////////////////////////////////////////////////////////// - // When the image is first created - set the margins - // to be the standard viewport. - // The standard viewport is the full area of the view surface (or panel), - // less a margin of 4 character heights all round for labelling. - // It thus depends on the current character size, set by SetCharacterHeight(). - ///////////////////////////////////////////////////////////////// - - $str = split("\n",$this->title_txt); - $nbLines = count($str); - - if ($this->use_ttf == 1) { - $title_size = $this->TTFBBoxSize($this->title_ttffont_size, $this->title_angle, $this->title_ttffont, 'X'); //An array - if ($nbLines == 1) { - $this->y_top_margin = $title_size[1] * 4; - } else { - $this->y_top_margin = $title_size[1] * ($nbLines+3); - } - - //ajo working here - //$x_label_size = $this->TTFBBoxSize($this->x_label_ttffont_size, 0, $this->axis_ttffont, $this->x_label_txt); - - $this->y_bot_margin = $this->x_label_height ; - $this->x_left_margin = $this->y_label_width * 2 + $this->tick_length; - $this->x_right_margin = 33.0; // distance between right and end of x axis in pixels - } else { - $title_size = array(ImageFontWidth($this->title_font) * strlen($this->title_txt),ImageFontHeight($this->title_font)); - //$this->y_top_margin = ($title_size[1] * 4); - if ($nbLines == 1) { - $this->y_top_margin = $title_size[1] * 4; - } else { - $this->y_top_margin = $title_size[1] * ($nbLines+3); - } - if ($this->x_datalabel_angle == 90) { - $this->y_bot_margin = 76.0; // Must be integer - } else { - $this->y_bot_margin = 66.0; // Must be integer - } - $this->x_left_margin = 77.0; // distance between left and start of x axis in pixels - $this->x_right_margin = 33.0; // distance between right and end of x axis in pixels - } - - //exit; - $this->x_tot_margin = $this->x_left_margin + $this->x_right_margin; - $this->y_tot_margin = $this->y_top_margin + $this->y_bot_margin; - - if ($this->plot_max_x && $this->plot_max_y && $this->plot_area_width ) { //If data has already been analysed then set translation - $this->SetTranslation(); - } - } - - function SetMarginsPixels($which_lm,$which_rm,$which_tm,$which_bm) { - //Set the plot area using margins in pixels (left, right, top, bottom) - $this->SetNewPlotAreaPixels($which_lm,$which_tm,($this->image_width - $which_rm),($this->image_height - $which_bm)); - return true; - } - - function SetNewPlotAreaPixels($x1,$y1,$x2,$y2) { - //Like in GD 0,0 is upper left set via pixel Coordinates - $this->plot_area = array($x1,$y1,$x2,$y2); - $this->plot_area_width = $this->plot_area[2] - $this->plot_area[0]; - $this->plot_area_height = $this->plot_area[3] - $this->plot_area[1]; - $this->y_top_margin = $this->plot_area[1]; - if ($this->plot_max_x) { - $this->SetTranslation(); - } - return true; - } - - function SetPlotAreaPixels($x1,$y1,$x2,$y2) { - //Like in GD 0,0 is upper left - if (!$this->x_tot_margin) { - $this->SetMargins(); - } - if ($x2 && $y2) { - $this->plot_area = array($x1,$y1,$x2,$y2); - } else { - $this->plot_area = array($this->x_left_margin, $this->y_top_margin, - $this->image_width - $this->x_right_margin, - $this->image_height - $this->y_bot_margin - ); - } - $this->plot_area_width = $this->plot_area[2] - $this->plot_area[0]; - $this->plot_area_height = $this->plot_area[3] - $this->plot_area[1]; - - return true; - - } - - function SetPlotAreaWorld($xmin,$ymin,$xmax,$ymax) { - if (($xmin == "") && ($xmax == "")) { - //For automatic setting of data we need $this->max_x - if (!$this->max_y) { - $this->FindDataLimits() ; - } - if ($this->data_type == 'text-data') { //labels for text-data is done at data drawing time for speed. - $xmax = $this->max_x + 1 ; //valid for BAR CHART TYPE GRAPHS ONLY - $xmin = 0 ; //valid for BAR CHART TYPE GRAPHS ONLY - } else { - $xmax = $this->max_x * 1.02; - $xmin = $this->min_x; - } - - $ymax = ceil($this->max_y * 1.2); - if ($this->min_y < 0) { - $ymin = floor($this->min_y * 1.2); - } else { - $ymin = 0; - } - } $this->plot_min_x = $xmin; $this->plot_max_x = $xmax; - + if ($ymin == $ymax) { $ymax += 1; } @@ -1070,11 +1033,11 @@ class PHPlot } $this->plot_min_y = $ymin; $this->plot_max_y = $ymax; - + if ($ymax <= $ymin) { $this->DrawError('Error in Data - max not gt min'); } - + //Set the boundaries of the box for plotting in world coord // if (!$this->x_tot_margin) { //We need to know the margins before we can calculate scale // $this->SetMargins(); @@ -1083,26 +1046,26 @@ class PHPlot if ($this->plot_area_width) { $this->SetTranslation(); } - + return true; - + } //function SetPlotAreaWorld - - + + function PrintError($error_message) { // prints the error message to stdout and die echo "

Fatal error: $error_message

"; die; } - + function DrawError($error_message) { // prints the error message inline into // the generated image - + if (($this->img) == "") { $this->InitImage(); } ; - + $ypos = $this->image_height/2; - + if ($this->use_ttf == 1) { ImageRectangle($this->img, 0,0,$this->image_width,$this->image_height,ImageColorAllocate($this->img,255,255,255)); ImageTTFText($this->img, $this->small_ttffont_size, 0, $xpos, $ypos, ImageColorAllocate($this->img,0,0,0), $this->axis_ttffont, $error_message); @@ -1110,1555 +1073,1541 @@ class PHPlot ImageRectangle($this->img, 0,0,$this->image_width,$this->image_height,ImageColorAllocate($this->img,255,255,255)); ImageString($this->img, $this->small_font,1,$ypos,$error_message, ImageColorAllocate($this->img,0,0,0)); } - + $this->PrintImage(); return true; } - + function TTFBBoxSize($size, $angle, $font, $string) { - + //Assume angle < 90 $arr = ImageTTFBBox($size, 0, $font, $string); $flat_width = $arr[0] - $arr[2]; $flat_height = abs($arr[3] - $arr[5]); - + // for 90deg: // $height = $arr[5] - $arr[7]; // $width = $arr[2] - $arr[4]; - + $angle = deg2rad($angle); $width = ceil(abs($flat_width*cos($angle) + $flat_height*sin($angle))); //Must be integer $height = ceil(abs($flat_width*sin($angle) + $flat_height*cos($angle))); //Must be integer - + return array($width, $height); } + + function SetXLabelHeight() { - function SetXLabelHeight() { + if ($this->use_ttf == 1) { + //Space for the X Label + $size = $this->TTFBBoxSize($this->x_label_ttffont_size, 0, $this->axis_ttffont, $this->x_label_txt); + $tmp = $size[1]; - if ($this->use_ttf == 1) { - //Space for the X Label - $size = $this->TTFBBoxSize($this->x_label_ttffont_size, 0, $this->axis_ttffont, $this->x_label_txt); - $tmp = $size[1]; + //$string = Str_Repeat('w', $this->x_datalabel_maxlength); + $i = 0; + $string = ''; + while ($i < $this->x_datalabel_maxlength) { + $string .= 'w'; + $i++; + } - //$string = Str_Repeat('w', $this->x_datalabel_maxlength); - $i = 0; - $string = ''; - while ($i < $this->x_datalabel_maxlength) { - $string .= 'w'; - $i++; - } + //Space for the axis data labels + $size = $this->TTFBBoxSize($this->axis_ttffont_size, $this->x_datalabel_angle, $this->axis_ttffont, $string); - //Space for the axis data labels - $size = $this->TTFBBoxSize($this->axis_ttffont_size, $this->x_datalabel_angle, $this->axis_ttffont, $string); + $this->x_label_height = 2*$tmp + $size[1] + 4; - $this->x_label_height = 2*$tmp + $size[1] + 4; - - } else { - //For Non-TTF fonts we can have only angles 0 or 90 - if ($this->x_datalabel_angle == 90) { - $this->x_label_height = $this->x_datalabel_maxlength * ImageFontWidth($this->small_font) / 1.5; - } else { - $this->x_label_height = 5 * ImageFontHeight($this->small_font); - } - } - - $this->SetMargins(); - - return true; - } //function SetXLabelHeight - - function SetYLabelWidth() { - //$ylab = sprintf("%6.1f %s",$i,$si_units[0]); //use for PHP2 compatibility - //the "." is for space. It isn't actually printed - $ylab = number_format($this->max_y, $this->y_precision, ".", ",") . $this->si_units . "."; - - if ($this->use_ttf == 1) { - $size = $this->TTFBBoxSize($this->axis_ttffont_size, 0, $this->axis_ttffont, $ylab); - } else { - $size[0] = StrLen($ylab) * $this->small_font_width * .6; - } - - $this->y_label_width = $size[0] * 2; - //echo "SYLW: $this->y_label_width
"; - //exit; - - $this->SetMargins(); - return true; - } - - function SetEqualXCoord() { - //for plots that have equally spaced x variables and multiple bars per x-point. - - $space = ($this->plot_area[2] - $this->plot_area[0]) / ($this->number_x_points * 2) * $this->group_frac_width; - $group_width = $space * 2; - $bar_width = $group_width / $this->records_per_group; - //I think that eventually this space variable will be replaced by just graphing x. - $this->data_group_space = $space; - $this->record_bar_width = $bar_width; - return true; - } - - function SetLabelScalePosition($which_blp) { - //0 to 1 - $this->label_scale_position = $which_blp; - return true; - } - - function SetErrorBarSize($which_ebs) { - //in pixels - $this->error_bar_size = $which_ebs; - return true; - } - - function SetErrorBarShape($which_ebs) { - //in pixels - $this->error_bar_shape = $which_ebs; - return true; - } - - function SetPointShape($which_pt) { - //in pixels - $this->point_shape = $which_pt; - return true; - } - - function SetPointSize($which_ps) { - //in pixels - SetType($which_ps,'integer'); - $this->point_size = $which_ps; - - if ($this->point_shape == "diamond" or $this->point_shape == "triangle") { - if ($this->point_size % 2 != 0) { - $this->point_size++; - } - } - return true; - } - - function SetDataType($which_dt) { - //The next three lines are for past compatibility. - if ($which_dt == "text-linear") { $which_dt = "text-data"; }; - if ($which_dt == "linear-linear") { $which_dt = "data-data"; }; - if ($which_dt == "linear-linear-error") { $which_dt = "data-data-error"; }; - - $this->data_type = $which_dt; //text-data, data-data, data-data-error - return true; - } - - function SetDataValues($which_dv) - { - $this->data_values = $which_dv; - //echo $this->data_values - return true; - } - - //////////////COLORS - function SetRGBArray ($which_color_array) { - if ( is_array($which_color_array) ) { - //User Defined Array - $this->rgb_array = $which_color_array; - return true; - } elseif ($which_color_array == 2) { //Use the small predefined color array - $this->rgb_array = array( - "white" => array(255, 255, 255), - "snow" => array(255, 250, 250), - "PeachPuff" => array(255, 218, 185), - "ivory" => array(255, 255, 240), - "lavender" => array(230, 230, 250), - "black" => array( 0, 0, 0), - "DimGrey" => array(105, 105, 105), - "gray" => array(190, 190, 190), - "grey" => array(190, 190, 190), - "navy" => array( 0, 0, 128), - "SlateBlue" => array(106, 90, 205), - "blue" => array( 0, 0, 255), - "SkyBlue" => array(135, 206, 235), - "cyan" => array( 0, 255, 255), - "DarkGreen" => array( 0, 100, 0), - "green" => array( 0, 255, 0), - "YellowGreen" => array(154, 205, 50), - "yellow" => array(255, 255, 0), - "orange" => array(255, 165, 0), - "gold" => array(255, 215, 0), - "peru" => array(205, 133, 63), - "beige" => array(245, 245, 220), - "wheat" => array(245, 222, 179), - "tan" => array(210, 180, 140), - "brown" => array(165, 42, 42), - "salmon" => array(250, 128, 114), - "red" => array(255, 0, 0), - "pink" => array(255, 192, 203), - "maroon" => array(176, 48, 96), - "magenta" => array(255, 0, 255), - "violet" => array(238, 130, 238), - "plum" => array(221, 160, 221), - "orchid" => array(218, 112, 214), - "purple" => array(160, 32, 240), - "azure1" => array(240, 255, 255), - "aquamarine1" => array(127, 255, 212) - ); - return true; - } elseif ($which_color_array == 1) { - include("./rgb.inc.php"); //Get large $ColorArray - $this->rgb_array = $RGBArray; - } else { - $this->rgb_array = array("white" =>array(255,255,255), "black" => array(0,0,0)); - exit; - } - - return true; - } - - function SetColor($which_color) { - //obsoleted by SetRGBColor - SetRgbColor($which_color); - return true; - } - - function SetIndexColor($which_color) { //Color is passed in as anything - list ($r, $g, $b) = $this->SetRgbColor($which_color); //Translate to RGB - $index = ImageColorExact($this->img, $r, $g, $b); - if ($index == -1) { - //return ImageColorAllocate($this->img, $r, $g, $b); - //return ImageColorClosest($this->img, $r, $g, $b); - return ImageColorResolve($this->img, $r, $g, $b); //requires PHP 3.0.2 and later - } else { - return $index; - } - } - - function SetTransparentColor($which_color) { - ImageColorTransparent($this->img,$this->SetIndexColor($which_color)); - return true; - } - - function SetRgbColor($color_asked) { - //Returns an array in R,G,B format 0-255 - if ($color_asked == "") { $color_asked = array(0,0,0); }; - - if ( count($color_asked) == 3 ) { //already array of 3 rgb - $ret_val = $color_asked; - } else { // is asking for a color by string - if(substr($color_asked,0,1) == "#") { //asking in #FFFFFF format. - $ret_val = array(hexdec(substr($color_asked,1,2)), hexdec(substr($color_asked,3,2)), hexdec(substr($color,5,2))); - } else { - $ret_val = $this->rgb_array[$color_asked]; - } - } - return $ret_val; - } - - function SetDataColors($which_data,$which_border) { - //Set the data to be displayed in a particular color - if (!$which_data) { - $which_data = array(array(0,255,0),array(0,0,248),'yellow',array(255,0,0),'orange'); - $which_border = array('black'); - } - - $this->data_color = $which_data; //an array - $this->data_border_color = $which_border; //an array - - unset($this->ndx_data_color); - reset($this->data_color); //data_color can be an array of colors, one for each thing plotted - //while (list(, $col) = each($this->data_color)) - $i = 0; - while (list(, $col) = each($which_data)) { - $this->ndx_data_color[$i] = $this->SetIndexColor($col); - $i++; - } - - // border_color - //If we are also going to put a border on the data (bars, dots, area, ...) - // then lets also set a border color as well. - //foreach($this->data_border_color as $col) - unset($this->ndx_data_border_color); - reset($this->data_border_color); - $i = 0; - while (list(, $col) = each($this->data_border_color)) { - $this->ndx_data_border_color[$i] = $this->SetIndexColor($col); - $i++; - } - - //Set color of the error bars to be that of data if not already set. - if (!$this->error_bar_color) { - reset($which_data); - $this->SetErrorBarColors($which_data); - } - - return true; - - } //function SetDataColors - - function SetErrorBarColors($which_data) { - - //Set the data to be displayed in a particular color - - if ($which_data) { - $this->error_bar_color = $which_data; //an array - unset($this->ndx_error_bar_color); - reset($this->error_bar_color); //data_color can be an array of colors, one for each thing plotted - $i = 0; - while (list(, $col) = each($this->error_bar_color)) { - $this->ndx_error_bar_color[$i] = $this->SetIndexColor($col); - $i++; - } - return true; - } - return false; - } //function SetErrorBarColors - - - function DrawPlotBorder() { - switch ($this->plot_border_type) { - case "left" : - ImageLine($this->img, $this->plot_area[0],$this->ytr($this->plot_min_y), - $this->plot_area[0],$this->ytr($this->plot_max_y),$this->ndx_grid_color); - break; - case "none": - //Draw No Border - break; - default: - ImageRectangle($this->img, $this->plot_area[0],$this->ytr($this->plot_min_y), - $this->plot_area[2],$this->ytr($this->plot_max_y),$this->ndx_grid_color); - break; - } - $this->DrawYAxis(); - $this->DrawXAxis(); - return true; - } - - - function SetHorizTickIncrement($which_ti) { - //Use either this or NumHorizTicks to set where to place x tick marks - if ($which_ti) { - $this->horiz_tick_increment = $which_ti; //world coordinates - } else { - if (!$this->max_x) { - $this->FindDataLimits(); //Get maxima and minima for scaling - } - //$this->horiz_tick_increment = ( ceil($this->max_x * 1.2) - floor($this->min_x * 1.2) )/10; - $this->horiz_tick_increment = ($this->plot_max_x - $this->plot_min_x )/10; - } - $this->num_horiz_ticks = ''; //either use num_vert_ticks or vert_tick_increment, not both - return true; - } - - function SetDrawVertTicks($which_dvt) { - $this->draw_vert_ticks = $which_dvt; - return true; - } - - function SetVertTickIncrement($which_ti) - { - //Use either this or NumVertTicks to set where to place y tick marks - if ($which_ti) - { - $this->vert_tick_increment = $which_ti; //world coordinates - } - else - { - if (!$this->max_y) - { - $this->FindDataLimits(); //Get maxima and minima for scaling - } - //$this->vert_tick_increment = ceil(( ceil($this->max_y * 1.2) - floor($this->min_y * 1.2) )/10); - $this->vert_tick_increment = ($this->plot_max_y - $this->plot_min_y )/10; - } - $this->num_vert_ticks = ''; //either use num_vert_ticks or vert_tick_increment, not both - return true; - } - - function SetNumHorizTicks($which_nt) { - $this->num_horiz_ticks = $which_nt; - $this->horiz_tick_increment = ''; //either use num_horiz_ticks or horiz_tick_increment, not both - return true; - } - - function SetNumVertTicks($which_nt) - { - $this->num_vert_ticks = $which_nt; - $this->vert_tick_increment = ''; //either use num_vert_ticks or vert_tick_increment, not both - return true; - } - function SetVertTickPosition($which_tp) { - $this->vert_tick_position = $which_tp; //plotleft, plotright, both, yaxis - return true; - } - function SetSkipBottomTick($which_sbt) { - $this->skip_bottom_tick = $which_sbt; - return true; - } - - function SetTickLength($which_tl) { - $this->tick_length = $which_tl; - return true; - } - - function DrawYAxis() { - //Draw Line at left side or at this->y_axis_position - if ($this->y_axis_position != "") { - $yaxis_x = $this->xtr($this->y_axis_position); - } else { - $yaxis_x = $this->plot_area[0]; - } - - ImageLine($this->img, $yaxis_x, $this->plot_area[1], - $yaxis_x, $this->plot_area[3], $this->ndx_grid_color); - //$yaxis_x, $this->plot_area[3], 9); - - if ($this->draw_vert_ticks == 1) { - $this->DrawVerticalTicks(); - } - - } //function DrawYAxis - - function DrawXAxis() { - //Draw Tick and Label for Y axis - $ylab =$this->FormatYTickLabel($this->x_axis_position); - if ($this->skip_bottom_tick != 1) { - $this->DrawVerticalTick($ylab,$this->x_axis_position); - } - - //Draw X Axis at Y=$x_axis_postion - ImageLine($this->img,$this->plot_area[0]+1,$this->ytr($this->x_axis_position), - $this->xtr($this->plot_max_x)-1,$this->ytr($this->x_axis_position),$this->ndx_tick_color); - - //X Ticks and Labels - if ($this->data_type != 'text-data') { //labels for text-data done at data drawing time for speed. - $this->DrawHorizontalTicks(); - } - return true; - } - - function DrawHorizontalTicks() { - //Ticks and lables are drawn on the left border of PlotArea. - //Left Bottom - ImageLine($this->img,$this->plot_area[0], - $this->plot_area[3]+$this->tick_length, - $this->plot_area[0],$this->plot_area[3],$this->ndx_tick_color); - - switch ($this->x_grid_label_type) { - case "title": - $xlab = $this->data_values[0][0]; - break; - case "data": - $xlab = number_format($this->plot_min_x,$this->x_precision,".",",") . "$this->si_units"; - break; - case "none": - $xlab = ''; - break; - case "time": //Time formatting suggested by Marlin Viss - $xlab = strftime($this->x_time_format,$this->plot_min_x); - break; - default: - //Unchanged from whatever format is passed in - $xlab = $this->plot_min_x; - break; - } - - if ($this->x_datalabel_angle == 90) { - $xpos = $this->plot_area[0] - $this->small_font_height/2; - $ypos = ( $this->small_font_width*strlen($xlab) + $this->plot_area[3] + $this->small_font_height); - ImageStringUp($this->img, $this->small_font,$xpos, $ypos, $xlab, $this->ndx_text_color); - } else { - $xpos = $this->plot_area[0] - $this->small_font_width*strlen($xlab)/2 ; - $ypos = $this->plot_area[3] + $this->small_font_height; - ImageString($this->img, $this->small_font,$xpos, $ypos, $xlab, $this->ndx_text_color); - } - - //Will be changed to allow for TTF fonts in data as well. - //$this->DrawText($this->small_font, $this->x_datalabel_angle, $xpos, $ypos, $this->ndx_title_color, '', $xlab); - - //Top - - if ($this->horiz_tick_increment) { - $delta_x = $this->horiz_tick_increment; - } elseif ($this->num_horiz_ticks) { - $delta_x = ($this->plot_max_x - $this->plot_min_x) / $this->num_horiz_ticks; - } else { - $delta_x =($this->plot_max_x - $this->plot_min_x) / 10 ; - } - - $i = 0; - $x_tmp = $this->plot_min_x; - SetType($x_tmp,'double'); - - while ($x_tmp <= $this->plot_max_x){ - //$xlab = sprintf("%6.1f %s",$min_x,$si_units[0]); //PHP2 past compatibility - switch ($this->x_grid_label_type) { - case "title": - $xlab = $this->data_values[$x_tmp][0]; - break; - case "data": - $xlab = number_format($x_tmp,$this->x_precision,".",",") . "$this->si_units"; - break; - case "none": - $xlab = ''; - break; - case "time": //Time formatting suggested by Marlin Viss - $xlab = strftime($this->x_time_format,$x_tmp); - break; - default: - //Unchanged from whatever format is passed in - $xlab = $x_tmp; - break; - } - - $x_pixels = $this->xtr($x_tmp); - - //Bottom Tick - ImageLine($this->img,$x_pixels,$this->plot_area[3] + $this->tick_length, - $x_pixels,$this->plot_area[3], $this->ndx_tick_color); - //Top Tick - //ImageLine($this->img,($this->xtr($this->plot_max_x)+$this->tick_length), - // $y_pixels,$this->xtr($this->plot_max_x)-1,$y_pixels,$this->ndx_tick_color); - - if ($this->draw_x_grid == 1) { - ImageLine($this->img,$x_pixels,$this->plot_area[1], - $x_pixels,$this->plot_area[3], $this->ndx_light_grid_color); - } - - if ($this->x_datalabel_angle == 90) { //Vertical Code Submitted by Marlin Viss - ImageStringUp($this->img, $this->small_font, - ( $x_pixels - $this->small_font_height/2), - ( $this->small_font_width*strlen($xlab) + $this->plot_area[3] + $this->small_font_height),$xlab, $this->ndx_text_color); - } else { - ImageString($this->img, $this->small_font, - ( $x_pixels - $this->small_font_width*strlen($xlab)/2) , - ( $this->small_font_height + $this->plot_area[3]),$xlab, $this->ndx_text_color); - } - - $i++; - $x_tmp += $delta_x; - } - - } // function DrawHorizontalTicks - - function FormatYTickLabel($which_ylab) { - switch ($this->y_grid_label_type) { - case "data": - $ylab = number_format($which_ylab,$this->y_precision,".",",") . "$this->si_units"; - break; - case "none": - $ylab = ''; - break; - case "time": - $ylab = strftime($this->y_time_format,$which_ylab); - break; - case "right": - //Make it right aligned - //$ylab = str_pad($which_ylab,$this->y_label_width," ",STR_PAD_LEFT); //PHP4 only - $sstr = "%".strlen($this->plot_max_y)."s"; - $ylab = sprintf($sstr,$which_ylab); - break; - default: - //Unchanged from whatever format is passed in - $ylab = $which_ylab; - break; - } - - return($ylab); - - } //function FormatYTickLabel - - function DrawVerticalTick($which_ylab,$which_ypos) { //ylab in world coord. - //Draw Just one Tick, called from DrawVerticalTicks - //Ticks and datalables can be left of plot only, right of plot only, - // both on the left and right of plot, or crossing a user defined Y-axis - // - //Its faster to draw both left and right ticks at same time - // than first left and then right. - - if ($this->y_axis_position != "") { - //Ticks and lables are drawn on the left border of yaxis - $yaxis_x = $this->xtr($this->y_axis_position); - } else { - //Ticks and lables are drawn on the left border of PlotArea. - $yaxis_x = $this->plot_area[0]; - } - - $y_pixels = $this->ytr($which_ypos); - - //Lines Across the Plot Area - if ($this->draw_y_grid == 1) { - ImageLine($this->img,$this->plot_area[0]+1,$y_pixels, - $this->plot_area[2]-1,$y_pixels,$this->ndx_light_grid_color); - } - - //Ticks to the Left of the Plot Area - if (($this->vert_tick_position == "plotleft") || ($this->vert_tick_position == "both") ) { - ImageLine($this->img,(-$this->tick_length+$yaxis_x), - $y_pixels,$yaxis_x, - $y_pixels, $this->ndx_tick_color); - } - - //Ticks to the Right of the Plot Area - if (($this->vert_tick_position == "plotright") || ($this->vert_tick_position == "both") ) { - ImageLine($this->img,($this->plot_area[2]+$this->tick_length), - $y_pixels,$this->plot_area[2], - $y_pixels,$this->ndx_tick_color); - } - - //Ticks on the Y Axis - if (($this->vert_tick_position == "yaxis") ) { - ImageLine($this->img,($yaxis_x - $this->tick_length), - $y_pixels,$yaxis_x,$y_pixels,$this->ndx_tick_color); - } - - //DataLabel - //ajo working - //$this->DrawText($this->y_label_ttffont, 0,($yaxis_x - $this->y_label_width - $this->tick_length/2), - // $y_pixels, $this->ndx_text_color, $this->axis_ttffont_size, $which_ylab); - ImageString($this->img, $this->small_font, ($yaxis_x - $this->y_label_width - $this->tick_length/2), - ( -($this->small_font_height/2.0) + $y_pixels),$which_ylab, $this->ndx_text_color); - } - - function DrawVerticalTicks() { - - if ($this->skip_top_tick != 1) { //If tick increment doesn't hit the top - //Left Top - //ImageLine($this->img,(-$this->tick_length+$this->xtr($this->plot_min_x)), - // $this->ytr($this->plot_max_y),$this->xtr($this->plot_min_x),$this->ytr($this->plot_max_y),$this->ndx_tick_color); - //$ylab = $this->FormatYTickLabel($plot_max_y); - - //Right Top - //ImageLine($this->img,($this->xtr($this->plot_max_x)+$this->tick_length), - // $this->ytr($this->plot_max_y),$this->xtr($this->plot_max_x-1),$this->ytr($this->plot_max_y),$this->ndx_tick_color); - - //Draw Grid Line at Top - ImageLine($this->img,$this->plot_area[0]+1,$this->ytr($this->plot_max_y), - $this->plot_area[2]-1,$this->ytr($this->plot_max_y),$this->ndx_light_grid_color); - - } - - if ($this->skip_bottom_tick != 1) { - //Right Bottom - //ImageLine($this->img,($this->xtr($this->plot_max_x)+$this->tick_length), - // $this->ytr($this->plot_min_y),$this->xtr($this->plot_max_x), - // $this->ytr($this->plot_min_y),$this->ndx_tick_color); - - //Draw Grid Line at Bottom of Plot - ImageLine($this->img,$this->xtr($this->plot_min_x)+1,$this->ytr($this->plot_min_y), - $this->xtr($this->plot_max_x),$this->ytr($this->plot_min_y),$this->ndx_light_grid_color); - } - - // maxy is always > miny so delta_y is always positive - if ($this->vert_tick_increment) - { - $delta_y = $this->vert_tick_increment; - } - elseif($this->num_vert_ticks) - { - $delta_y = ($this->plot_max_y - $this->plot_min_y) / $this->num_vert_ticks; - } - else - { - $delta_y = ($this->plot_max_y - $this->plot_min_y) / 10 ; - } - - $y_tmp = $this->plot_min_y; - SetType($y_tmp,'double'); - if ($this->skip_bottom_tick == 1) { - $y_tmp += $delta_y; - } - - while ($y_tmp <= $this->plot_max_y){ - //For log plots: - if (($this->yscale_type == "log") && ($this->plot_min_y == 1) && - ($delta_y%10 == 0) && ($y_tmp == $this->plot_min_y)) { - $y_tmp = $y_tmp - 1; //Set first increment to 9 to get: 1,10,20,30,... - } - - $ylab = $this->FormatYTickLabel($y_tmp); - - $this->DrawVerticalTick($ylab,$y_tmp); - - $y_tmp += $delta_y; - } - - return true; - - } // function DrawVerticalTicks - - function SetTranslation() { - if ($this->xscale_type == "log") { - $this->xscale = ($this->plot_area_width)/(log10($this->plot_max_x) - log10($this->plot_min_x)); - } else { - $this->xscale = ($this->plot_area_width)/($this->plot_max_x - $this->plot_min_x); - } - if ($this->yscale_type == "log") { - $this->yscale = ($this->plot_area_height)/(log10($this->plot_max_y) - log10($this->plot_min_y)); - } else { - $this->yscale = ($this->plot_area_height)/($this->plot_max_y - $this->plot_min_y); - } - - // GD defines x=0 at left and y=0 at TOP so -/+ respectively - if ($this->xscale_type == "log") { - $this->plot_origin_x = $this->plot_area[0] - ($this->xscale * log10($this->plot_min_x) ); - } else { - $this->plot_origin_x = $this->plot_area[0] - ($this->xscale * $this->plot_min_x); - } - if ($this->yscale_type == "log") { - $this->plot_origin_y = $this->plot_area[3] + ($this->yscale * log10($this->plot_min_y)); - } else { - $this->plot_origin_y = $this->plot_area[3] + ($this->yscale * $this->plot_min_y); - } - - $this->scale_is_set = 1; - } // function SetTranslation - - function xtr($x_world) { - //Translate world coordinates into pixel coordinates - //The pixel coordinates are those of the ENTIRE image, not just the plot_area - //$x_pixels = $this->x_left_margin + ($this->image_width - $this->x_tot_margin)*(($x_world - $this->plot_min_x) / ($this->plot_max_x - $this->plot_min_x)) ; - //which with a little bit of math reduces to ... - if ($this->xscale_type == "log") { - $x_pixels = $this->plot_origin_x + log10($x_world) * $this->xscale ; - } else { - $x_pixels = $this->plot_origin_x + $x_world * $this->xscale ; - } - return($x_pixels); - } - - function ytr($y_world) { - // translate y world coord into pixel coord - if ($this->yscale_type == "log") { - $y_pixels = $this->plot_origin_y - log10($y_world) * $this->yscale ; //minus because GD defines y=0 at top. doh! - } else { - $y_pixels = $this->plot_origin_y - $y_world * $this->yscale ; - } - return ($y_pixels); - } - - - function DrawDataLabel($lab,$x_world,$y_world) { - //Depreciated. Use DrawText Instead. - //Data comes in in WORLD coordinates - //Draw data label near actual data point - //$y = $this->ytr($y_world) ; //in pixels - //$x = $this->xtr($x_world) ; - //$this->DrawText($which_font,$which_angle,$which_xpos,$which_ypos,$which_color,$which_size,$which_text,$which_halign='left'); - if ($this->use_ttf) { - //ajjjo - $lab_size = $this->TTFBBoxSize($this->axis_ttffont_size, $this->x_datalabel_angle, $this->axis_ttffont, $lab); //An array - $y = $this->ytr($y_world) - $lab_size[1] ; //in pixels - $x = $this->xtr($x_world) - $lab_size[0]/2; - ImageTTFText($this->img, $this->axis_ttffont_size, $this->x_datalabel_angle, $x, $y, $this->ndx_text_color, $this->axis_ttffont, $lab); - } else { - $lab_size = array($this->small_font_width*StrLen($lab), $this->small_font_height*3); - if ($this->x_datalabel_angle == 90) { - $y = $this->ytr($y_world) - $this->small_font_width*StrLen($lab); //in pixels - $x = $this->xtr($x_world) - $this->small_font_height; - ImageStringUp($this->img, $this->small_font,$x, $y ,$lab, $this->ndx_text_color); - } else { - $y = $this->ytr($y_world) - $this->small_font_height; //in pixels - $x = $this->xtr($x_world) - ($this->small_font_width*StrLen($lab))/2; - ImageString($this->img, $this->small_font,$x, $y ,$lab, $this->ndx_text_color); - } - } - - } - - function DrawXDataLabel($xlab,$xpos) { - //xpos comes in in PIXELS not in world coordinates. - //Draw an x data label centered at xlab - if ($this->use_ttf) { - $xlab_size = $this->TTFBBoxSize($this->axis_ttffont_size, - $this->x_datalabel_angle, $this->axis_ttffont, $xlab); //An array - $y = $this->plot_area[3] + $xlab_size[1] + 4; //in pixels - $x = $xpos - $xlab_size[0]/2; - ImageTTFText($this->img, $this->axis_ttffont_size, - $this->x_datalabel_angle, $x, $y, $this->ndx_text_color, $this->axis_ttffont, $xlab); - } else { - $xlab_size = array(ImageFontWidth($this->axis_font)*StrLen($xlab), $this->small_font_height*3); - if ($this->x_datalabel_angle == 90) { - $y = $this->plot_area[3] + ImageFontWidth($this->axis_font)*StrLen($xlab); //in pixels - $x = $xpos - ($this->small_font_height); - ImageStringUp($this->img, $this->axis_font,$x, $y ,$xlab, $this->ndx_text_color); - } else { - $y = $this->plot_area[3] + ImageFontHeight($this->axis_font); //in pixels - $x = $xpos - (ImageFontWidth($this->axis_font)*StrLen($xlab))/2; - ImageString($this->img, $this->axis_font,$x, $y ,$xlab, $this->ndx_text_color); - } - } - - } - - function DrawPieChart() { - //$pi = '3.14159265358979323846'; - $xpos = $this->plot_area[0] + $this->plot_area_width/2; - $ypos = $this->plot_area[1] + $this->plot_area_height/2; - $diameter = (min($this->plot_area_width, $this->plot_area_height)) ; - $radius = $diameter/2; - - ImageArc($this->img, $xpos, $ypos, $diameter, $diameter, 0, 360, $this->ndx_grid_color); - - $total = 0; - reset($this->data_values); - $tmp = $this->number_x_points - 1; - while (list($j, $row) = each($this->data_values)) { - //Get sum of each type - $color_index = 0; - $i = 0; - //foreach ($row as $v) - while (list($k, $v) = each($row)) { - if ($k != 0) { - if ($j == 0) { - $sumarr[$i] = $v; - } elseif ($j < $tmp) { - $sumarr[$i] += $v; - } else { - $sumarr[$i] += $v; - // NOTE! sum > 0 to make pie charts - $sumarr[$i] = abs($sumarr[$i]); - $total += $sumarr[$i]; - } - } - $i++; - } - } - - $color_index = 0; - $start_angle = 0; - - reset($sumarr); - $end_angle = 0; - while (list(, $val) = each($sumarr)) { - if ($color_index >= count($this->ndx_data_color)) $color_index=0; //data_color = array - $label_txt = number_format(($val / $total * 100), $this->y_precision, ".", ",") . "%"; - $val = 360 * ($val / $total); - - $end_angle += $val; - $mid_angle = $end_angle - ($val / 2); - - $slicecol = $this->ndx_data_color[$color_index]; - - //Need this again for FillToBorder - ImageArc($this->img, $xpos, $ypos, $diameter, $diameter, 0, 360, $this->ndx_grid_color); - - $out_x = $radius * cos(deg2rad($end_angle)); - $out_y = - $radius * sin(deg2rad($end_angle)); - - $mid_x = $xpos + ($radius/2 * cos(deg2rad($mid_angle))) ; - $mid_y = $ypos + (- $radius/2 * sin(deg2rad($mid_angle))); - - $label_x = $xpos + ($radius * cos(deg2rad($mid_angle))) * $this->label_scale_position; - $label_y = $ypos + (- $radius * sin(deg2rad($mid_angle))) * $this->label_scale_position; - - $out_x = $xpos + $out_x; - $out_y = $ypos + $out_y; - - ImageLine($this->img, $xpos, $ypos, $out_x, $out_y, $this->ndx_grid_color); - //ImageLine($this->img, $xpos, $ypos, $label_x, $label_y, $this->ndx_grid_color); - ImageFillToBorder($this->img, $mid_x, $mid_y, $this->ndx_grid_color, $slicecol); - - if ($this->use_ttf) { - ImageTTFText($this->img, $this->axis_ttffont_size, 0, $label_x, $label_y, $this->ndx_grid_color, $this->axis_ttffont, $label_txt); - } else { - ImageString($this->img, $this->small_font, $label_x, $label_y, $label_txt, $this->ndx_grid_color); - } - - $start_angle = $val; - - $color_index++; - } - - } - - function DrawLinesError() { - //Draw Lines with Error Bars - data comes in as array("title",x,y,error+,error-,y2,error2+,error2-,...); - $start_lines = 0; - - reset($this->data_values); - while (list(, $row) = each($this->data_values)) { - $color_index = 0; - $i = 0; - - while (list($key, $val) = each($row)) { - //echo "$key, $i, $val
"; - if ($key == 0) { - $lab = $val; - } elseif ($key == 1) { - $x_now = $val; - $x_now_pixels = $this->xtr($x_now); //Use a bit more memory to save 2N operations. - } elseif ($key%3 == 2) { - $y_now = $val; - $y_now_pixels = $this->ytr($y_now); - - //Draw Data Label - if ( $this->draw_data_labels == 1) { - $this->DrawDataLabel($lab,$x_now,$y_now); - } - - if ($color_index >= count($this->ndx_data_color)) { $color_index=0;}; - $barcol = $this->ndx_data_color[$color_index]; - $error_barcol = $this->ndx_error_bar_color[$color_index]; - - //echo "start = $start_lines
"; - if ($start_lines == 1) { - for ($width = 0; $width < $this->line_width; $width++) { - ImageLine($this->img, $x_now_pixels, $y_now_pixels + $width, - $lastx[$i], $lasty[$i] + $width, $barcol); - } - } - - $lastx[$i] = $x_now_pixels; - $lasty[$i] = $y_now_pixels; - $color_index++; - $i++; - $start_lines = 1; - } elseif ($key%3 == 0) { - $this->DrawYErrorBar($x_now,$y_now,$val,$this->error_bar_shape,$error_barcol); - } elseif ($key%3 == 1) { - $this->DrawYErrorBar($x_now,$y_now,-$val,$this->error_bar_shape,$error_barcol); - } - } - } - } - - function DrawDotsError() { - //Draw Dots - data comes in as array("title",x,y,error+,error-,y2,error2+,error2-,...); - reset($this->data_values); - while (list(, $row) = each($this->data_values)) { - $color_index = 0; - //foreach ($row as $v) - while (list($key, $val) = each($row)) { - if ($key == 0) { - } elseif ($key == 1) { - $xpos = $val; - } elseif ($key%3 == 2) { - if ($color_index >= count($this->ndx_data_color)) $color_index=0; - $barcol = $this->ndx_data_color[$color_index]; - $error_barcol = $this->ndx_error_bar_color[$color_index]; - $ypos = $val; - - $color_index++; - $this->DrawDot($xpos,$ypos,$this->point_shape,$barcol); - } elseif ($key%3 == 0) { - $this->DrawYErrorBar($xpos,$ypos,$val,$this->error_bar_shape,$error_barcol); - } elseif ($key%3 == 1) { - $mine = $val ; - $this->DrawYErrorBar($xpos,$ypos,-$val,$this->error_bar_shape,$error_barcol); - } - } - } - - } - - function DrawDots() { - //Draw Dots - data comes in as array("title",x,y1,y2,y3,...); - reset($this->data_values); - while (list($j, $row) = each($this->data_values)) { - $color_index = 0; - //foreach ($row as $v) - while (list($k, $v) = each($row)) { - if ($k == 0) { - } elseif (($k == 1) && ($this->data_type == "data-data")) { - $xpos = $v; - } else { - if ($this->data_type == "text-data") { - $xpos = ($j+.5); - } - if ($color_index >= count($this->ndx_data_color)) $color_index=0; - $barcol = $this->ndx_data_color[$color_index]; - - //if (is_numeric($v)) //PHP4 only - if ((strval($v) != "") ) { //Allow for missing Y data - $this->DrawDot($xpos,$v,$this->point_shape,$barcol); - } - $color_index++; - } - } - } - - } //function DrawDots - - function DrawDotSeries() { - //Depreciated: Use DrawDots - $this->DrawDots(); - } - - function DrawThinBarLines() { - //A clean,fast routine for when you just want charts like stock volume charts - //Data must be text-data since I didn't see a graphing need for equally spaced thin lines. - //If you want it - then write to afan@jeo.net and I might add it. - - if ($this->data_type != "data-data") { $this->DrawError('Data Type for ThinBarLines must be data-data'); }; - $y1 = $this->ytr($this->x_axis_position); - - reset($this->data_values); - while (list(, $row) = each($this->data_values)) { - $color_index = 0; - while (list($k, $v) = each($row)) { - if ($k == 0) { - $xlab = $v; - } elseif ($k == 1) { - $xpos = $this->xtr($v); - if ( ($this->draw_x_data_labels == 1) ) { //See "labels_note1 above. - $this->DrawXDataLabel($xlab,$xpos); - } - } else { - if ($color_index >= count($this->ndx_data_color)) $color_index=0; - $barcol = $this->ndx_data_color[$color_index]; - - ImageLine($this->img,$xpos,$y1,$xpos,$this->ytr($v),$barcol); - $color_index++; - } - } - } - - } //function DrawThinBarLines - - function DrawYErrorBar($x_world,$y_world,$error_height,$error_bar_type,$color) { - $x1 = $this->xtr($x_world); - $y1 = $this->ytr($y_world); - $y2 = $this->ytr($y_world+$error_height) ; - - for ($width = 0; $width < $this->error_bar_line_width; $width++) { - ImageLine($this->img, $x1+$width, $y1 , $x1+$width, $y2, $color); - ImageLine($this->img, $x1-$width, $y1 , $x1-$width, $y2, $color); - } - switch ($error_bar_type) { - case "line": - break; - case "tee": - ImageLine($this->img, $x1-$this->error_bar_size, $y2, $x1+$this->error_bar_size, $y2, $color); - break; - default: - ImageLine($this->img, $x1-$this->error_bar_size, $y2, $x1+$this->error_bar_size, $y2, $color); - break; - } - return true; - } - - function DrawDot($x_world,$y_world,$dot_type,$color) { - $half_point = $this->point_size / 2; - $x1 = $this->xtr($x_world) - $half_point; - $x2 = $this->xtr($x_world) + $half_point; - $y1 = $this->ytr($y_world) - $half_point; - $y2 = $this->ytr($y_world) + $half_point; - - switch ($dot_type) { - case "halfline": - ImageFilledRectangle($this->img, $x1, $this->ytr($y_world), $this->xtr($x_world), $this->ytr($y_world), $color); - break; - case "line": - ImageFilledRectangle($this->img, $x1, $this->ytr($y_world), $x2, $this->ytr($y_world), $color); - break; - case "rect": - ImageFilledRectangle($this->img, $x1, $y1, $x2, $y2, $color); - break; - case "circle": - ImageArc($this->img, $x1 + $half_point, $y1 + $half_point, $this->point_size, $this->point_size, 0, 360, $color); - break; - case "dot": - ImageArc($this->img, $x1 + $half_point, $y1 + $half_point, $this->point_size, $this->point_size, 0, 360, $color); - ImageFillToBorder($this->img, $x1 + $half_point, $y1 + $half_point, $color, $color); - break; - case "diamond": - - $arrpoints = array( - $x1,$y1 + $half_point, - $x1 + $half_point, $y1, - $x2,$y1 + $half_point, - $x1 + $half_point, $y2 - ); - - ImageFilledPolygon($this->img, $arrpoints, 4, $color); - break; - case "triangle": - $arrpoints = array( $x1, $y1 + $half_point, - $x2, $y1 + $half_point, - $x1 + $half_point, $y2 - ); - ImageFilledPolygon($this->img, $arrpoints, 3, $color); - break; - default: - ImageFilledRectangle($this->img, $x1, $y1, $x2, $y2, $color); - break; - } - return true; - } - - function SetErrorBarLineWidth($which_seblw) { - $this->error_bar_line_width = $which_seblw; - return true; - } - - - function SetLineWidth($which_lw) { - $this->line_width = $which_lw; - if (!$this->error_bar_line_width) { - $this->error_bar_line_width = $which_lw; - } - return true; - } - - function DrawArea() { - //Data comes in as $data[]=("title",x,y,...); - //Set first and last datapoints of area - $i = 0; - while ($i < $this->records_per_group) { - $posarr[$i][] = $this->xtr($this->min_x); //x initial - $posarr[$i][] = $this->ytr($this->x_axis_position); //y initial - $i++; - } - - reset($this->data_values); - while (list($j, $row) = each($this->data_values)) { - $color_index = 0; - //foreach ($row as $v) - while (list($k, $v) = each($row)) { - if ($k == 0) { - //Draw Data Labels - $xlab = SubStr($v,0,$this->x_datalabel_maxlength); - } elseif ($k == 1) { - $x = $this->xtr($v); - // DrawXDataLabel interferes with Numbers on x-axis - //$this->DrawXDataLabel($xlab,$x); - } else { - // Create Array of points for later - - $y = $this->ytr($v); - $posarr[$color_index][] = $x; - $posarr[$color_index][] = $y; - $color_index++; - } - } - } - - //Final_points - for ($i = 0; $i < $this->records_per_group; $i++) { - $posarr[$i][] = $this->xtr($this->max_x); //x final - $posarr[$i][] = $this->ytr($this->x_axis_position); //y final - } - - $color_index=0; - - //foreach($posarr as $row) - reset($posarr); - while (list(, $row) = each($posarr)) { - if ($color_index >= count($this->ndx_data_color)) $color_index=0; - $barcol = $this->ndx_data_color[$color_index]; - //echo "$row[0],$row[1],$row[2],$row[3],$row[4],$row[5],$row[6],$row[7],$row[8],$row[9],$row[10],$row[11],$row[12], $barcol
"; - ImageFilledPolygon($this->img, $row, (count($row)) / 2, $barcol); - $color_index++; - } - //exit; - - } - - function DrawAreaSeries() { - - //Set first and last datapoints of area - $i = 0; - while ($i < $this->records_per_group) { - $posarr[$i][] = $this->xtr(.5); //x initial - $posarr[$i][] = $this->ytr($this->x_axis_position); //y initial - $i++; - } - - reset($this->data_values); - while (list($j, $row) = each($this->data_values)) { - $color_index = 0; - //foreach ($row as $v) - while (list($k, $v) = each($row)) { - if ($k == 0) { - //Draw Data Labels - $xlab = SubStr($v,0,$this->x_datalabel_maxlength); - $this->DrawXDataLabel($xlab,$this->xtr($j + .5)); - } else { - // Create Array of points for later - - $x = round($this->xtr($j + .5 )); - $y = round($this->ytr($v)); - $posarr[$color_index][] = $x; - $posarr[$color_index][] = $y; - $color_index++; - } - } - } - - //Final_points - for ($i = 0; $i < $this->records_per_group; $i++) { - $posarr[$i][] = round($this->xtr($this->max_x + .5)); //x final - $posarr[$i][] = $this->ytr($this->x_axis_position); //y final - } - - $color_index=0; - - //foreach($posarr as $row) - reset($posarr); - while (list(, $row) = each($posarr)) { - if ($color_index >= count($this->ndx_data_color)) $color_index=0; - $barcol = $this->ndx_data_color[$color_index]; - //echo "$row[0],$row[1],$row[2],$row[3],$row[4],$row[5],$row[6],$row[7],$row[8],$row[9],$row[10],$row[11],$row[12], $barcol
"; - ImageFilledPolygon($this->img, $row, (count($row)) / 2, $barcol); - $color_index++; - } - - } - - function DrawLines() { - //Data comes in as $data[]=("title",x,y,...); - $start_lines = 0; - if ($this->data_type == "text-data") { - $lastx[0] = $this->xtr(0); - $lasty[0] = $this->xtr(0); - } - - //foreach ($this->data_values as $row) - reset($this->data_values); - while (list($j, $row) = each($this->data_values)) { - - $color_index = 0; - $i = 0; - //foreach ($row as $v) - while (list($k, $v) = each($row)) { - if ($k == 0) { - $xlab = SubStr($v,0,$this->x_datalabel_maxlength); - } elseif (($k == 1) && ($this->data_type == "data-data")) { - $x_now = $this->xtr($v); - } else { - //(double) $v; - // Draw Lines - if ($this->data_type == "text-data") { - $x_now = $this->xtr($j+.5); - } - - //if (is_numeric($v)) //PHP4 only - if ((strval($v) != "") ) { //Allow for missing Y data - $y_now = $this->ytr($v); - if ($color_index >= count($this->ndx_data_color)) { $color_index=0;} ; - $barcol = $this->ndx_data_color[$color_index]; - - if ($start_lines == 1) { - for ($width = 0; $width < $this->line_width; $width++) { - if ($this->line_style[$i] == "dashed") { - $this->DrawDashedLine($x_now, $y_now + $width, $lastx[$i], $lasty[$i] + $width, 4,4, $barcol); } else { - ImageLine($this->img, $x_now, $y_now + $width, $lastx[$i], $lasty[$i] + $width, $barcol); + //For Non-TTF fonts we can have only angles 0 or 90 + if ($this->x_datalabel_angle == 90) { + $this->x_label_height = $this->x_datalabel_maxlength * ImageFontWidth($this->small_font) / 1.5; + } else { + $this->x_label_height = 5 * ImageFontHeight($this->small_font); + } } - } - } - $lastx[$i] = $x_now; - } else { - $y_now = $lasty[$i]; - //Don't increment lastx[$i] - } - //$bordercol = $this->ndx_data_border_color[$colbarcount]; - $lasty[$i] = $y_now; - $color_index++; - $i++; - } - //Now we are assured an x_value - if ( ($this->draw_x_data_labels == 1) && ($k == 1) ) { //See "labels_note1 above. - $this->DrawXDataLabel($xlab,$x_now); - } - } //while rows of data - $start_lines = 1; - } - } + $this->SetMargins(); - //Data comes in as $data[]=("title",x,y,e+,e-,y2,e2+,e2-,...); + return true; + } //function SetXLabelHeight - function DrawLineSeries() { - //This function is replaced by DrawLines - //Tests have shown not much improvement in speed by having separate routines for DrawLineSeries and DrawLines - //For ease of programming I have combined them - return false; - } //function DrawLineSeries + function SetYLabelWidth() { + //$ylab = sprintf("%6.1f %s",$i,$si_units[0]); //use for PHP2 compatibility + //the "." is for space. It isn't actually printed + $ylab = number_format($this->max_y, $this->y_precision, ".", ",") . $this->si_units . "."; - function DrawDashedLine($x1pix,$y1pix,$x2pix,$y2pix,$dash_length,$dash_space,$color) { - //Code based on work by Ariel Garza and James Pine - //I've decided to have this be in pixels only as a replacement for ImageLine - //$x1pix = $this->xtr($x1); - //$y1pix = $this->ytr($y1); - //$x2pix = $this->xtr($x2); - //$y2pix = $this->ytr($y2); + if ($this->use_ttf == 1) { + $size = $this->TTFBBoxSize($this->axis_ttffont_size, 0, $this->axis_ttffont, $ylab); + } else { + $size[0] = StrLen($ylab) * $this->small_font_width * .6; + } - // Get the length of the line in pixels - $line_length = ceil (sqrt(pow(($x2pix - $x1pix),2) + pow(($y2pix - $y1pix),2)) ); + $this->y_label_width = $size[0] * 2; +//echo "SYLW: $this->y_label_width
"; +//exit; - $dx = ($x2pix - $x1pix) / $line_length; - $dy = ($y2pix - $y1pix) / $line_length; - $lastx = $x1pix; - $lasty = $y1pix; - - // Draw the dashed line - for ($i = 0; $i < $line_length; $i += ($dash_length + $dash_space)) { - $xpix = ($dash_length * $dx) + $lastx; - $ypix = ($dash_length * $dy) + $lasty; - - ImageLine($this->img,$lastx,$lasty,$xpix,$ypix,$color); - $lastx = $xpix + ($dash_space * $dx); - $lasty = $ypix + ($dash_space * $dy); - } - } // function DrawDashedLine - - function DrawBars() { - - if ($this->data_type != "text-data") { - $this->DrawError('Bar plots must be text-data: use function SetDataType("text-data")'); - } - - $xadjust = ($this->records_per_group * $this->record_bar_width )/4; - - reset($this->data_values); - while (list($j, $row) = each($this->data_values)) { - - $color_index = 0; - $colbarcount = 0; - $x_now = $this->xtr($j+.5); - - while (list($k, $v) = each($row)) { - if ($k == 0) { - //Draw Data Labels - $xlab = SubStr($v,0,$this->x_datalabel_maxlength); - $this->DrawXDataLabel($xlab,$x_now); - } else { - // Draw Bars ($v) - $x1 = $x_now - $this->data_group_space + ($k-1)*$this->record_bar_width; - $x2 = $x1 + $this->record_bar_width*$this->bar_width_adjust; - - if ($v < $this->x_axis_position) { - $y1 = $this->ytr($this->x_axis_position); - $y2 = $this->ytr($v); - } else { - $y1 = $this->ytr($v); - $y2 = $this->ytr($this->x_axis_position); - } - - if ($color_index >= count($this->ndx_data_color)) $color_index=0; - if ($colbarcount >= count($this->ndx_data_border_color)) $colbarcount=0; - $barcol = $this->ndx_data_color[$color_index]; - $bordercol = $this->ndx_data_border_color[$colbarcount]; - - if ((strval($v) != "") ) { //Allow for missing Y data - if ($this->shading > 0) { - for($i=0;$i<($this->shading);$i++) { - //Shading set in SetDefaultColors - ImageFilledRectangle($this->img, $x1+$i, $y1-$i, $x2+$i, $y2-$i, $this->ndx_i_light); - } - } - - ImageFilledRectangle($this->img, $x1, $y1, $x2, $y2, $barcol); - ImageRectangle($this->img, $x1, $y1, $x2, $y2, $bordercol); - if ($this->draw_data_labels == '1') { //ajo - $y1 = $this->ytr($this->label_scale_position * $v); - //$this->DrawDataLabel($v,$j + .5,$v*$this->label_scale_position); - $this->DrawText($this->x_label_ttffont, $this->x_label_angle, - $x1+$this->record_bar_width/2, $y1, $this->ndx_label_color, $this->x_label_ttffont_size, $v,'center','top'); - } - } - - $color_index++; - $colbarcount++; - } - } - } - } //function DrawBars - - function DrawLegend($which_x1,$which_y1,$which_boxtype) { - //Base code submitted by Marlin Viss - $max_legend_length=0; - reset($this->legend); - while (list(,$leg) = each($this->legend)) { - $len = strlen($leg); - if ($max_legend_length < $len) { - $max_legend_length = $len; - } - } - - $line_spacing = 1.25; - $vert_margin = $this->small_font_height/2 ; - $dot_height = $this->small_font_height*$line_spacing - 1; - - //Upper Left - if ((!$which_x1) || (!$which_y1) ) { - $box_start_x = $this->plot_area[2] - $this->small_font_width*($max_legend_length+4); - $box_start_y = $this->plot_area[1] + 4; - } else { - $box_start_x = $which_x1; - $box_start_y = $which_y1; - } - - //Lower Right - $box_end_y = $box_start_y + $this->small_font_height*(count($this->legend)+1) + 2*$vert_margin; - //$box_end_x = $this->plot_area[2] - 5; - $box_end_x = $box_start_x + $this->small_font_width*($max_legend_length+4) - 5; - - - // Draw box for legend - ImageFilledRectangle($this->img, - $box_start_x, $box_start_y,$box_end_x, - $box_end_y, $this->ndx_bg_color); - ImageRectangle($this->img, - $box_start_x, $box_start_y,$box_end_x, - $box_end_y, $this->ndx_grid_color); - - $color_index=0; - $i = 0; - - - reset($this->legend); - - - while (list(,$leg) = each($this->legend)) { - $y_pos = $box_start_y + $this->small_font_height*($i)*($line_spacing) + $vert_margin; - - ImageString($this->img, $this->small_font, - $box_start_x + $this->small_font_width*( $max_legend_length - strlen($leg) + 1 ) , - $y_pos, - $leg, $this->ndx_text_color); - - if ($color_index >= count($this->ndx_data_color)) $color_index=0; - // Draw a box in the data color - ImageFilledRectangle($this->img, - $box_end_x - $this->small_font_width*2, - $y_pos + 1, $box_end_x - $this->small_font_width, - $y_pos + $dot_height, - $this->ndx_data_color[$color_index]); - - ImageRectangle($this->img, - $box_end_x - $this->small_font_width*2, - $y_pos + 1, $box_end_x - $this->small_font_width, - $y_pos + $dot_height, - $this->ndx_text_color); - $i++; - $color_index++; - } - } //function DrawLegend - - - function DrawGraph() { - - if (($this->img) == "") { - $this->DrawError('No Image Defined: DrawGraph'); - //$this->PHPlot(); - } - - if (! is_array($this->data_values)) { - $this->DrawBackground(); - $this->DrawError("No array of data in \$data_values"); - } else { - if (!$this->data_color) { - $this->SetDataColors(array('blue','green','yellow','red','orange','blue'),array('black')); - } - - $this->FindDataLimits(); //Get maxima and minima for scaling - - $this->SetXLabelHeight(); //Get data for bottom margin - - $this->SetYLabelWidth(); //Get data for left margin - - if (!$this->plot_area_width) { - $this->SetPlotAreaPixels('','','',''); //Set Margins - } - - if (!$this->plot_max_y) { //If not set by user call SetPlotAreaWorld, - $this->SetPlotAreaWorld('','','',''); - } - - if ($this->data_type == "text-data") { - $this->SetEqualXCoord(); - } - - $this->SetPointSize($this->point_size); - - $this->DrawBackground(); - $this->DrawImageBorder(); - - $this->SetTranslation(); - - if ($this->draw_plot_area_background == 1) { - $this->DrawPlotAreaBackground(); - } - //$foo = "$this->max_y, $this->min_y, $new_miny, $new_maxy, $this->x_label_height"; - //ImageString($this->img, 4, 20, 20, $foo, $this->ndx_text_color); - - switch ($this->plot_type) - { - case "bars": - $this->DrawPlotBorder(); - $this->DrawLabels(); - $this->DrawBars(); - $this->DrawXAxis(); - break; - case "thinbarline": - $this->DrawPlotBorder(); - $this->DrawLabels(); - $this->DrawThinBarLines(); - break; - case "lines": - $this->DrawPlotBorder(); - $this->DrawLabels(); - if ( $this->data_type == "text-data") { - $this->DrawLines(); - } elseif ( $this->data_type == "data-data-error") { - $this->DrawLinesError(); - } else { - $this->DrawLines(); - } - break; - case "area": - $this->DrawPlotBorder(); - $this->DrawLabels(); - if ( $this->data_type == "text-data") { - $this->DrawAreaSeries(); - } else { - $this->DrawArea(); - } - break; - case "linepoints": - $this->DrawPlotBorder(); - $this->DrawLabels(); - if ( $this->data_type == "text-data") { - $this->DrawLines(); - $this->DrawDots(); - } elseif ( $this->data_type == "data-data-error") { - $this->DrawLinesError(); - $this->DrawDotsError(); - } else { - $this->DrawLines(); - $this->DrawDots(); - } - break; - case "points"; - $this->DrawPlotBorder(); - $this->DrawLabels(); - if ( $this->data_type == "text-data") { - $this->DrawDots(); - } elseif ( $this->data_type == "data-data-error") { - $this->DrawDotsError(); - } else { - $this->DrawDots(); - } - break; - case "pie": - $this->DrawPieChart(); - $this->DrawLabels(); - break; - default: - $this->DrawPlotBorder(); - $this->DrawLabels(); - $this->DrawBars(); - break; + $this->SetMargins(); + return true; } - if ($this->legend) { - $this->DrawLegend($this->legend_x_pos,$this->legend_y_pos,''); - } + function SetEqualXCoord() { + //for plots that have equally spaced x variables and multiple bars per x-point. - } - if ($this->print_image == 1) - { - $this->PrintImage(); - } - } //function DrawGraph + $space = ($this->plot_area[2] - $this->plot_area[0]) / ($this->number_x_points * 2) * $this->group_frac_width; + $group_width = $space * 2; + $bar_width = $group_width / $this->records_per_group; + //I think that eventually this space variable will be replaced by just graphing x. + $this->data_group_space = $space; + $this->record_bar_width = $bar_width; + return true; + } -} + function SetLabelScalePosition($which_blp) { + //0 to 1 + $this->label_scale_position = $which_blp; + return true; + } + + function SetErrorBarSize($which_ebs) { + //in pixels + $this->error_bar_size = $which_ebs; + return true; + } + + function SetErrorBarShape($which_ebs) { + //in pixels + $this->error_bar_shape = $which_ebs; + return true; + } + + function SetPointShape($which_pt) { + //in pixels + $this->point_shape = $which_pt; + return true; + } + + function SetPointSize($which_ps) { + //in pixels + SetType($which_ps,'integer'); + $this->point_size = $which_ps; + + if ($this->point_shape == "diamond" or $this->point_shape == "triangle") { + if ($this->point_size % 2 != 0) { + $this->point_size++; + } + } + return true; + } + + function SetDataType($which_dt) { + //The next three lines are for past compatibility. + if ($which_dt == "text-linear") { $which_dt = "text-data"; }; + if ($which_dt == "linear-linear") { $which_dt = "data-data"; }; + if ($which_dt == "linear-linear-error") { $which_dt = "data-data-error"; }; + + $this->data_type = $which_dt; //text-data, data-data, data-data-error + return true; + } + + function SetDataValues($which_dv) { + $this->data_values = $which_dv; +//echo $this->data_values + return true; + } + +//////////////COLORS + function SetRGBArray ($which_color_array) { + if ( is_array($which_color_array) ) { + //User Defined Array + $this->rgb_array = $which_color_array; + return true; + } elseif ($which_color_array == 2) { //Use the small predefined color array + $this->rgb_array = array( + "white" => array(255, 255, 255), + "snow" => array(255, 250, 250), + "PeachPuff" => array(255, 218, 185), + "ivory" => array(255, 255, 240), + "lavender" => array(230, 230, 250), + "black" => array( 0, 0, 0), + "DimGrey" => array(105, 105, 105), + "gray" => array(190, 190, 190), + "grey" => array(190, 190, 190), + "navy" => array( 0, 0, 128), + "SlateBlue" => array(106, 90, 205), + "blue" => array( 0, 0, 255), + "SkyBlue" => array(135, 206, 235), + "cyan" => array( 0, 255, 255), + "DarkGreen" => array( 0, 100, 0), + "green" => array( 0, 255, 0), + "YellowGreen" => array(154, 205, 50), + "yellow" => array(255, 255, 0), + "orange" => array(255, 165, 0), + "gold" => array(255, 215, 0), + "peru" => array(205, 133, 63), + "beige" => array(245, 245, 220), + "wheat" => array(245, 222, 179), + "tan" => array(210, 180, 140), + "brown" => array(165, 42, 42), + "salmon" => array(250, 128, 114), + "red" => array(255, 0, 0), + "pink" => array(255, 192, 203), + "maroon" => array(176, 48, 96), + "magenta" => array(255, 0, 255), + "violet" => array(238, 130, 238), + "plum" => array(221, 160, 221), + "orchid" => array(218, 112, 214), + "purple" => array(160, 32, 240), + "azure1" => array(240, 255, 255), + "aquamarine1" => array(127, 255, 212) + ); + return true; + } elseif ($which_color_array == 1) { + include("./rgb.inc.php"); //Get large $ColorArray + $this->rgb_array = $RGBArray; + } else { + $this->rgb_array = array("white" =>array(255,255,255), "black" => array(0,0,0)); + exit; + } + + return true; + } + + function SetColor($which_color) { + //obsoleted by SetRGBColor + SetRgbColor($which_color); + return true; + } + + function SetIndexColor($which_color) { //Color is passed in as anything + list ($r, $g, $b) = $this->SetRgbColor($which_color); //Translate to RGB + $index = ImageColorExact($this->img, $r, $g, $b); + if ($index == -1) { + //return ImageColorAllocate($this->img, $r, $g, $b); + //return ImageColorClosest($this->img, $r, $g, $b); + return ImageColorResolve($this->img, $r, $g, $b); //requires PHP 3.0.2 and later + } else { + return $index; + } + } + + function SetTransparentColor($which_color) { + ImageColorTransparent($this->img,$this->SetIndexColor($which_color)); + return true; + } + + function SetRgbColor($color_asked) { + //Returns an array in R,G,B format 0-255 + if ($color_asked == "") { $color_asked = array(0,0,0); }; + + if ( count($color_asked) == 3 ) { //already array of 3 rgb + $ret_val = $color_asked; + } else { // is asking for a color by string + if(substr($color_asked,0,1) == "#") { //asking in #FFFFFF format. + $ret_val = array(hexdec(substr($color_asked,1,2)), hexdec(substr($color_asked,3,2)), hexdec(substr($color,5,2))); + } else { + $ret_val = $this->rgb_array[$color_asked]; + } + } + return $ret_val; + } + + function SetDataColors($which_data,$which_border) { + //Set the data to be displayed in a particular color + if (!$which_data) { + $which_data = array(array(0,255,0),array(0,0,248),'yellow',array(255,0,0),'orange'); + $which_border = array('black'); + } + + $this->data_color = $which_data; //an array + $this->data_border_color = $which_border; //an array + + unset($this->ndx_data_color); + reset($this->data_color); //data_color can be an array of colors, one for each thing plotted + //while (list(, $col) = each($this->data_color)) + $i = 0; + while (list(, $col) = each($which_data)) { + $this->ndx_data_color[$i] = $this->SetIndexColor($col); + $i++; + } + + // border_color + //If we are also going to put a border on the data (bars, dots, area, ...) + // then lets also set a border color as well. + //foreach($this->data_border_color as $col) + unset($this->ndx_data_border_color); + reset($this->data_border_color); + $i = 0; + while (list(, $col) = each($this->data_border_color)) { + $this->ndx_data_border_color[$i] = $this->SetIndexColor($col); + $i++; + } + + //Set color of the error bars to be that of data if not already set. + if (!$this->error_bar_color) { + reset($which_data); + $this->SetErrorBarColors($which_data); + } + + return true; + + } //function SetDataColors + + function SetErrorBarColors($which_data) { + + //Set the data to be displayed in a particular color + + if ($which_data) { + $this->error_bar_color = $which_data; //an array + unset($this->ndx_error_bar_color); + reset($this->error_bar_color); //data_color can be an array of colors, one for each thing plotted + $i = 0; + while (list(, $col) = each($this->error_bar_color)) { + $this->ndx_error_bar_color[$i] = $this->SetIndexColor($col); + $i++; + } + return true; + } + return false; + } //function SetErrorBarColors + + + function DrawPlotBorder() { + switch ($this->plot_border_type) { + case "left" : + ImageLine($this->img, $this->plot_area[0],$this->ytr($this->plot_min_y), + $this->plot_area[0],$this->ytr($this->plot_max_y),$this->ndx_grid_color); + break; + case "none": + //Draw No Border + break; + default: + ImageRectangle($this->img, $this->plot_area[0],$this->ytr($this->plot_min_y), + $this->plot_area[2],$this->ytr($this->plot_max_y),$this->ndx_grid_color); + break; + } + $this->DrawYAxis(); + $this->DrawXAxis(); + return true; + } + + + function SetHorizTickIncrement($which_ti) { + //Use either this or NumHorizTicks to set where to place x tick marks + if ($which_ti) { + $this->horiz_tick_increment = $which_ti; //world coordinates + } else { + if (!$this->max_x) { + $this->FindDataLimits(); //Get maxima and minima for scaling + } + //$this->horiz_tick_increment = ( ceil($this->max_x * 1.2) - floor($this->min_x * 1.2) )/10; + $this->horiz_tick_increment = ($this->plot_max_x - $this->plot_min_x )/10; + } + $this->num_horiz_ticks = ''; //either use num_vert_ticks or vert_tick_increment, not both + return true; + } + + function SetDrawVertTicks($which_dvt) { + $this->draw_vert_ticks = $which_dvt; + return true; + } + + function SetVertTickIncrement($which_ti) { + //Use either this or NumVertTicks to set where to place y tick marks + if ($which_ti) { + $this->vert_tick_increment = $which_ti; //world coordinates + } else { + if (!$this->max_y) { + $this->FindDataLimits(); //Get maxima and minima for scaling + } + //$this->vert_tick_increment = ( ceil($this->max_y * 1.2) - floor($this->min_y * 1.2) )/10; + $this->vert_tick_increment = ($this->plot_max_y - $this->plot_min_y )/10; + } + $this->num_vert_ticks = ''; //either use num_vert_ticks or vert_tick_increment, not both + return true; + } + + function SetNumHorizTicks($which_nt) { + $this->num_horiz_ticks = $which_nt; + $this->horiz_tick_increment = ''; //either use num_horiz_ticks or horiz_tick_increment, not both + return true; + } + + function SetNumVertTicks($which_nt) { + $this->num_vert_ticks = $which_nt; + $this->vert_tick_increment = ''; //either use num_vert_ticks or vert_tick_increment, not both + return true; + } + function SetVertTickPosition($which_tp) { + $this->vert_tick_position = $which_tp; //plotleft, plotright, both, yaxis + return true; + } + function SetSkipBottomTick($which_sbt) { + $this->skip_bottom_tick = $which_sbt; + return true; + } + + function SetTickLength($which_tl) { + $this->tick_length = $which_tl; + return true; + } + + function DrawYAxis() { + //Draw Line at left side or at this->y_axis_position + if ($this->y_axis_position != "") { + $yaxis_x = $this->xtr($this->y_axis_position); + } else { + $yaxis_x = $this->plot_area[0]; + } + + ImageLine($this->img, $yaxis_x, $this->plot_area[1], + $yaxis_x, $this->plot_area[3], $this->ndx_grid_color); + //$yaxis_x, $this->plot_area[3], 9); + + if ($this->draw_vert_ticks == 1) { + $this->DrawVerticalTicks(); + } + + } //function DrawYAxis + + function DrawXAxis() { + //Draw Tick and Label for Y axis + $ylab =$this->FormatYTickLabel($this->x_axis_position); + if ($this->skip_bottom_tick != 1) { + $this->DrawVerticalTick($ylab,$this->x_axis_position); + } + + //Draw X Axis at Y=$x_axis_postion + ImageLine($this->img,$this->plot_area[0]+1,$this->ytr($this->x_axis_position), + $this->xtr($this->plot_max_x)-1,$this->ytr($this->x_axis_position),$this->ndx_tick_color); + + //X Ticks and Labels + if ($this->data_type != 'text-data') { //labels for text-data done at data drawing time for speed. + $this->DrawHorizontalTicks(); + } + return true; + } + + function DrawHorizontalTicks() { + //Ticks and lables are drawn on the left border of PlotArea. + //Left Bottom + ImageLine($this->img,$this->plot_area[0], + $this->plot_area[3]+$this->tick_length, + $this->plot_area[0],$this->plot_area[3],$this->ndx_tick_color); + + switch ($this->x_grid_label_type) { + case "title": + $xlab = $this->data_values[0][0]; + break; + case "data": + $xlab = number_format($this->plot_min_x,$this->x_precision,".",",") . "$this->si_units"; + break; + case "none": + $xlab = ''; + break; + case "time": //Time formatting suggested by Marlin Viss + $xlab = strftime($this->x_time_format,$this->plot_min_x); + break; + default: + //Unchanged from whatever format is passed in + $xlab = $this->plot_min_x; + break; + } + + if ($this->x_datalabel_angle == 90) { + $xpos = $this->plot_area[0] - $this->small_font_height/2; + $ypos = ( $this->small_font_width*strlen($xlab) + $this->plot_area[3] + $this->small_font_height); + ImageStringUp($this->img, $this->small_font,$xpos, $ypos, $xlab, $this->ndx_text_color); + } else { + $xpos = $this->plot_area[0] - $this->small_font_width*strlen($xlab)/2 ; + $ypos = $this->plot_area[3] + $this->small_font_height; + ImageString($this->img, $this->small_font,$xpos, $ypos, $xlab, $this->ndx_text_color); + } + + //Will be changed to allow for TTF fonts in data as well. + //$this->DrawText($this->small_font, $this->x_datalabel_angle, $xpos, $ypos, $this->ndx_title_color, '', $xlab); + + //Top + + if ($this->horiz_tick_increment) { + $delta_x = $this->horiz_tick_increment; + } elseif ($this->num_horiz_ticks) { + $delta_x = ($this->plot_max_x - $this->plot_min_x) / $this->num_horiz_ticks; + } else { + $delta_x =($this->plot_max_x - $this->plot_min_x) / 10 ; + } + + $i = 0; + $x_tmp = $this->plot_min_x; + SetType($x_tmp,'double'); + + while ($x_tmp <= $this->plot_max_x){ + //$xlab = sprintf("%6.1f %s",$min_x,$si_units[0]); //PHP2 past compatibility + switch ($this->x_grid_label_type) { + case "title": + $xlab = $this->data_values[$x_tmp][0]; + break; + case "data": + $xlab = number_format($x_tmp,$this->x_precision,".",",") . "$this->si_units"; + break; + case "none": + $xlab = ''; + break; + case "time": //Time formatting suggested by Marlin Viss + $xlab = strftime($this->x_time_format,$x_tmp); + break; + default: + //Unchanged from whatever format is passed in + $xlab = $x_tmp; + break; + } + + $x_pixels = $this->xtr($x_tmp); + + //Bottom Tick + ImageLine($this->img,$x_pixels,$this->plot_area[3] + $this->tick_length, + $x_pixels,$this->plot_area[3], $this->ndx_tick_color); + //Top Tick + //ImageLine($this->img,($this->xtr($this->plot_max_x)+$this->tick_length), + // $y_pixels,$this->xtr($this->plot_max_x)-1,$y_pixels,$this->ndx_tick_color); + + if ($this->draw_x_grid == 1) { + ImageLine($this->img,$x_pixels,$this->plot_area[1], + $x_pixels,$this->plot_area[3], $this->ndx_light_grid_color); + } + + if ($this->x_datalabel_angle == 90) { //Vertical Code Submitted by Marlin Viss + ImageStringUp($this->img, $this->small_font, + ( $x_pixels - $this->small_font_height/2), + ( $this->small_font_width*strlen($xlab) + $this->plot_area[3] + $this->small_font_height),$xlab, $this->ndx_text_color); + } else { + ImageString($this->img, $this->small_font, + ( $x_pixels - $this->small_font_width*strlen($xlab)/2) , + ( $this->small_font_height + $this->plot_area[3]),$xlab, $this->ndx_text_color); + } + + $i++; + $x_tmp += $delta_x; + } + + } // function DrawHorizontalTicks + + function FormatYTickLabel($which_ylab) { + switch ($this->y_grid_label_type) { + case "data": + $ylab = number_format($which_ylab,$this->y_precision,".",",") . "$this->si_units"; + break; + case "none": + $ylab = ''; + break; + case "time": + $ylab = strftime($this->y_time_format,$which_ylab); + break; + case "right": + //Make it right aligned + //$ylab = str_pad($which_ylab,$this->y_label_width," ",STR_PAD_LEFT); //PHP4 only + $sstr = "%".strlen($this->plot_max_y)."s"; + $ylab = sprintf($sstr,$which_ylab); + break; + default: + //Unchanged from whatever format is passed in + $ylab = $which_ylab; + break; + } + + return($ylab); + + } //function FormatYTickLabel + + function DrawVerticalTick($which_ylab,$which_ypos) { //ylab in world coord. + //Draw Just one Tick, called from DrawVerticalTicks + //Ticks and datalables can be left of plot only, right of plot only, + // both on the left and right of plot, or crossing a user defined Y-axis + // + //Its faster to draw both left and right ticks at same time + // than first left and then right. + + if ($this->y_axis_position != "") { + //Ticks and lables are drawn on the left border of yaxis + $yaxis_x = $this->xtr($this->y_axis_position); + } else { + //Ticks and lables are drawn on the left border of PlotArea. + $yaxis_x = $this->plot_area[0]; + } + + $y_pixels = $this->ytr($which_ypos); + + //Lines Across the Plot Area + if ($this->draw_y_grid == 1) { + ImageLine($this->img,$this->plot_area[0]+1,$y_pixels, + $this->plot_area[2]-1,$y_pixels,$this->ndx_light_grid_color); + } + + //Ticks to the Left of the Plot Area + if (($this->vert_tick_position == "plotleft") || ($this->vert_tick_position == "both") ) { + ImageLine($this->img,(-$this->tick_length+$yaxis_x), + $y_pixels,$yaxis_x, + $y_pixels, $this->ndx_tick_color); + } + + //Ticks to the Right of the Plot Area + if (($this->vert_tick_position == "plotright") || ($this->vert_tick_position == "both") ) { + ImageLine($this->img,($this->plot_area[2]+$this->tick_length), + $y_pixels,$this->plot_area[2], + $y_pixels,$this->ndx_tick_color); + } + + //Ticks on the Y Axis + if (($this->vert_tick_position == "yaxis") ) { + ImageLine($this->img,($yaxis_x - $this->tick_length), + $y_pixels,$yaxis_x,$y_pixels,$this->ndx_tick_color); + } + + //DataLabel +//ajo working + //$this->DrawText($this->y_label_ttffont, 0,($yaxis_x - $this->y_label_width - $this->tick_length/2), + // $y_pixels, $this->ndx_text_color, $this->axis_ttffont_size, $which_ylab); + ImageString($this->img, $this->small_font, ($yaxis_x - $this->y_label_width - $this->tick_length/2), + ( -($this->small_font_height/2.0) + $y_pixels),$which_ylab, $this->ndx_text_color); + } + + function DrawVerticalTicks() { + + if ($this->skip_top_tick != 1) { //If tick increment doesn't hit the top + //Left Top + //ImageLine($this->img,(-$this->tick_length+$this->xtr($this->plot_min_x)), + // $this->ytr($this->plot_max_y),$this->xtr($this->plot_min_x),$this->ytr($this->plot_max_y),$this->ndx_tick_color); + //$ylab = $this->FormatYTickLabel($plot_max_y); + + //Right Top + //ImageLine($this->img,($this->xtr($this->plot_max_x)+$this->tick_length), + // $this->ytr($this->plot_max_y),$this->xtr($this->plot_max_x-1),$this->ytr($this->plot_max_y),$this->ndx_tick_color); + + //Draw Grid Line at Top + ImageLine($this->img,$this->plot_area[0]+1,$this->ytr($this->plot_max_y), + $this->plot_area[2]-1,$this->ytr($this->plot_max_y),$this->ndx_light_grid_color); + + } + + if ($this->skip_bottom_tick != 1) { + //Right Bottom + //ImageLine($this->img,($this->xtr($this->plot_max_x)+$this->tick_length), + // $this->ytr($this->plot_min_y),$this->xtr($this->plot_max_x), + // $this->ytr($this->plot_min_y),$this->ndx_tick_color); + + //Draw Grid Line at Bottom of Plot + ImageLine($this->img,$this->xtr($this->plot_min_x)+1,$this->ytr($this->plot_min_y), + $this->xtr($this->plot_max_x),$this->ytr($this->plot_min_y),$this->ndx_light_grid_color); + } + + // maxy is always > miny so delta_y is always positive + if ($this->vert_tick_increment) { + $delta_y = $this->vert_tick_increment; + } elseif ($this->num_vert_ticks) { + $delta_y = ($this->plot_max_y - $this->plot_min_y) / $this->num_vert_ticks; + } else { + $delta_y =($this->plot_max_y - $this->plot_min_y) / 10 ; + } + + $y_tmp = $this->plot_min_y; + SetType($y_tmp,'double'); + if ($this->skip_bottom_tick == 1) { + $y_tmp += $delta_y; + } + + while ($y_tmp <= $this->plot_max_y){ + //For log plots: + if (($this->yscale_type == "log") && ($this->plot_min_y == 1) && + ($delta_y%10 == 0) && ($y_tmp == $this->plot_min_y)) { + $y_tmp = $y_tmp - 1; //Set first increment to 9 to get: 1,10,20,30,... + } + + $ylab = $this->FormatYTickLabel($y_tmp); + + $this->DrawVerticalTick($ylab,$y_tmp); + + $y_tmp += $delta_y; + } + + return true; + + } // function DrawVerticalTicks + + function SetTranslation() { + if ($this->xscale_type == "log") { + $this->xscale = ($this->plot_area_width)/(log10($this->plot_max_x) - log10($this->plot_min_x)); + } else { + $this->xscale = ($this->plot_area_width)/($this->plot_max_x - $this->plot_min_x); + } + if ($this->yscale_type == "log") { + $this->yscale = ($this->plot_area_height)/(log10($this->plot_max_y) - log10($this->plot_min_y)); + } else { + $this->yscale = ($this->plot_area_height)/($this->plot_max_y - $this->plot_min_y); + } + + // GD defines x=0 at left and y=0 at TOP so -/+ respectively + if ($this->xscale_type == "log") { + $this->plot_origin_x = $this->plot_area[0] - ($this->xscale * log10($this->plot_min_x) ); + } else { + $this->plot_origin_x = $this->plot_area[0] - ($this->xscale * $this->plot_min_x); + } + if ($this->yscale_type == "log") { + $this->plot_origin_y = $this->plot_area[3] + ($this->yscale * log10($this->plot_min_y)); + } else { + $this->plot_origin_y = $this->plot_area[3] + ($this->yscale * $this->plot_min_y); + } + + $this->scale_is_set = 1; + } // function SetTranslation + + function xtr($x_world) { + //Translate world coordinates into pixel coordinates + //The pixel coordinates are those of the ENTIRE image, not just the plot_area + //$x_pixels = $this->x_left_margin + ($this->image_width - $this->x_tot_margin)*(($x_world - $this->plot_min_x) / ($this->plot_max_x - $this->plot_min_x)) ; + //which with a little bit of math reduces to ... + if ($this->xscale_type == "log") { + $x_pixels = $this->plot_origin_x + log10($x_world) * $this->xscale ; + } else { + $x_pixels = $this->plot_origin_x + $x_world * $this->xscale ; + } + return($x_pixels); + } + + function ytr($y_world) { + // translate y world coord into pixel coord + if ($this->yscale_type == "log") { + $y_pixels = $this->plot_origin_y - log10($y_world) * $this->yscale ; //minus because GD defines y=0 at top. doh! + } else { + $y_pixels = $this->plot_origin_y - $y_world * $this->yscale ; + } + return ($y_pixels); + } + + + function DrawDataLabel($lab,$x_world,$y_world) { + //Depreciated. Use DrawText Instead. + //Data comes in in WORLD coordinates + //Draw data label near actual data point + //$y = $this->ytr($y_world) ; //in pixels + //$x = $this->xtr($x_world) ; + //$this->DrawText($which_font,$which_angle,$which_xpos,$which_ypos,$which_color,$which_size,$which_text,$which_halign='left'); + if ($this->use_ttf) { +//ajjjo + $lab_size = $this->TTFBBoxSize($this->axis_ttffont_size, $this->x_datalabel_angle, $this->axis_ttffont, $lab); //An array + $y = $this->ytr($y_world) - $lab_size[1] ; //in pixels + $x = $this->xtr($x_world) - $lab_size[0]/2; + ImageTTFText($this->img, $this->axis_ttffont_size, $this->x_datalabel_angle, $x, $y, $this->ndx_text_color, $this->axis_ttffont, $lab); + } else { + $lab_size = array($this->small_font_width*StrLen($lab), $this->small_font_height*3); + if ($this->x_datalabel_angle == 90) { + $y = $this->ytr($y_world) - $this->small_font_width*StrLen($lab); //in pixels + $x = $this->xtr($x_world) - $this->small_font_height; + ImageStringUp($this->img, $this->small_font,$x, $y ,$lab, $this->ndx_text_color); + } else { + $y = $this->ytr($y_world) - $this->small_font_height; //in pixels + $x = $this->xtr($x_world) - ($this->small_font_width*StrLen($lab))/2; + ImageString($this->img, $this->small_font,$x, $y ,$lab, $this->ndx_text_color); + } + } + + } + + function DrawXDataLabel($xlab,$xpos) { + //xpos comes in in PIXELS not in world coordinates. + //Draw an x data label centered at xlab + if ($this->use_ttf) { + $xlab_size = $this->TTFBBoxSize($this->axis_ttffont_size, + $this->x_datalabel_angle, $this->axis_ttffont, $xlab); //An array + $y = $this->plot_area[3] + $xlab_size[1] + 4; //in pixels + $x = $xpos - $xlab_size[0]/2; + ImageTTFText($this->img, $this->axis_ttffont_size, + $this->x_datalabel_angle, $x, $y, $this->ndx_text_color, $this->axis_ttffont, $xlab); + } else { + $xlab_size = array(ImageFontWidth($this->axis_font)*StrLen($xlab), $this->small_font_height*3); + if ($this->x_datalabel_angle == 90) { + $y = $this->plot_area[3] + ImageFontWidth($this->axis_font)*StrLen($xlab); //in pixels + $x = $xpos - ($this->small_font_height); + ImageStringUp($this->img, $this->axis_font,$x, $y ,$xlab, $this->ndx_text_color); + } else { + $y = $this->plot_area[3] + ImageFontHeight($this->axis_font); //in pixels + $x = $xpos - (ImageFontWidth($this->axis_font)*StrLen($xlab))/2; + ImageString($this->img, $this->axis_font,$x, $y ,$xlab, $this->ndx_text_color); + } + } + + } + + function DrawPieChart() { + //$pi = '3.14159265358979323846'; + $xpos = $this->plot_area[0] + $this->plot_area_width/2; + $ypos = $this->plot_area[1] + $this->plot_area_height/2; + $diameter = (min($this->plot_area_width, $this->plot_area_height)) ; + $radius = $diameter/2; + + ImageArc($this->img, $xpos, $ypos, $diameter, $diameter, 0, 360, $this->ndx_grid_color); + + $total = 0; + reset($this->data_values); + $tmp = $this->number_x_points - 1; + while (list($j, $row) = each($this->data_values)) { + //Get sum of each type + $color_index = 0; + $i = 0; + //foreach ($row as $v) + while (list($k, $v) = each($row)) { + if ($k != 0) { + if ($j == 0) { + $sumarr[$i] = $v; + } elseif ($j < $tmp) { + $sumarr[$i] += $v; + } else { + $sumarr[$i] += $v; + // NOTE! sum > 0 to make pie charts + $sumarr[$i] = abs($sumarr[$i]); + $total += $sumarr[$i]; + } + } + $i++; + } + } + + $color_index = 0; + $start_angle = 0; + + reset($sumarr); + $end_angle = 0; + while (list(, $val) = each($sumarr)) { + if ($color_index >= count($this->ndx_data_color)) $color_index=0; //data_color = array + $label_txt = number_format(($val / $total * 100), $this->y_precision, ".", ",") . "%"; + $val = 360 * ($val / $total); + + $end_angle += $val; + $mid_angle = $end_angle - ($val / 2); + + $slicecol = $this->ndx_data_color[$color_index]; + +//Need this again for FillToBorder + ImageArc($this->img, $xpos, $ypos, $diameter, $diameter, 0, 360, $this->ndx_grid_color); + + $out_x = $radius * cos(deg2rad($end_angle)); + $out_y = - $radius * sin(deg2rad($end_angle)); + + $mid_x = $xpos + ($radius/2 * cos(deg2rad($mid_angle))) ; + $mid_y = $ypos + (- $radius/2 * sin(deg2rad($mid_angle))); + + $label_x = $xpos + ($radius * cos(deg2rad($mid_angle))) * $this->label_scale_position; + $label_y = $ypos + (- $radius * sin(deg2rad($mid_angle))) * $this->label_scale_position; + + $out_x = $xpos + $out_x; + $out_y = $ypos + $out_y; + + ImageLine($this->img, $xpos, $ypos, $out_x, $out_y, $this->ndx_grid_color); + //ImageLine($this->img, $xpos, $ypos, $label_x, $label_y, $this->ndx_grid_color); + ImageFillToBorder($this->img, $mid_x, $mid_y, $this->ndx_grid_color, $slicecol); + + if ($this->use_ttf) { + ImageTTFText($this->img, $this->axis_ttffont_size, 0, $label_x, $label_y, $this->ndx_grid_color, $this->axis_ttffont, $label_txt); + } else { + ImageString($this->img, $this->small_font, $label_x, $label_y, $label_txt, $this->ndx_grid_color); + } + + $start_angle = $val; + + $color_index++; + } + + } + + function DrawLinesError() { + //Draw Lines with Error Bars - data comes in as array("title",x,y,error+,error-,y2,error2+,error2-,...); + $start_lines = 0; + + reset($this->data_values); + while (list(, $row) = each($this->data_values)) { + $color_index = 0; + $i = 0; + + while (list($key, $val) = each($row)) { +//echo "$key, $i, $val
"; + if ($key == 0) { + $lab = $val; + } elseif ($key == 1) { + $x_now = $val; + $x_now_pixels = $this->xtr($x_now); //Use a bit more memory to save 2N operations. + } elseif ($key%3 == 2) { + $y_now = $val; + $y_now_pixels = $this->ytr($y_now); + + //Draw Data Label + if ( $this->draw_data_labels == 1) { + $this->DrawDataLabel($lab,$x_now,$y_now); + } + + if ($color_index >= count($this->ndx_data_color)) { $color_index=0;}; + $barcol = $this->ndx_data_color[$color_index]; + $error_barcol = $this->ndx_error_bar_color[$color_index]; + +//echo "start = $start_lines
"; + if ($start_lines == 1) { + for ($width = 0; $width < $this->line_width; $width++) { + ImageLine($this->img, $x_now_pixels, $y_now_pixels + $width, + $lastx[$i], $lasty[$i] + $width, $barcol); + } + } + + $lastx[$i] = $x_now_pixels; + $lasty[$i] = $y_now_pixels; + $color_index++; + $i++; + $start_lines = 1; + } elseif ($key%3 == 0) { + $this->DrawYErrorBar($x_now,$y_now,$val,$this->error_bar_shape,$error_barcol); + } elseif ($key%3 == 1) { + $this->DrawYErrorBar($x_now,$y_now,-$val,$this->error_bar_shape,$error_barcol); + } + } + } + } + + function DrawDotsError() { + //Draw Dots - data comes in as array("title",x,y,error+,error-,y2,error2+,error2-,...); + reset($this->data_values); + while (list(, $row) = each($this->data_values)) { + $color_index = 0; + //foreach ($row as $v) + while (list($key, $val) = each($row)) { + if ($key == 0) { + } elseif ($key == 1) { + $xpos = $val; + } elseif ($key%3 == 2) { + if ($color_index >= count($this->ndx_data_color)) $color_index=0; + $barcol = $this->ndx_data_color[$color_index]; + $error_barcol = $this->ndx_error_bar_color[$color_index]; + $ypos = $val; + + $color_index++; + $this->DrawDot($xpos,$ypos,$this->point_shape,$barcol); + } elseif ($key%3 == 0) { + $this->DrawYErrorBar($xpos,$ypos,$val,$this->error_bar_shape,$error_barcol); + } elseif ($key%3 == 1) { + $mine = $val ; + $this->DrawYErrorBar($xpos,$ypos,-$val,$this->error_bar_shape,$error_barcol); + } + } + } + + } + + function DrawDots() { + //Draw Dots - data comes in as array("title",x,y1,y2,y3,...); + reset($this->data_values); + while (list($j, $row) = each($this->data_values)) { + $color_index = 0; + //foreach ($row as $v) + while (list($k, $v) = each($row)) { + if ($k == 0) { + } elseif (($k == 1) && ($this->data_type == "data-data")) { + $xpos = $v; + } else { + if ($this->data_type == "text-data") { + $xpos = ($j+.5); + } + if ($color_index >= count($this->ndx_data_color)) $color_index=0; + $barcol = $this->ndx_data_color[$color_index]; + + //if (is_numeric($v)) //PHP4 only + if ((strval($v) != "") ) { //Allow for missing Y data + $this->DrawDot($xpos,$v,$this->point_shape,$barcol); + } + $color_index++; + } + } + } + + } //function DrawDots + + function DrawDotSeries() { + //Depreciated: Use DrawDots + $this->DrawDots(); + } + + function DrawThinBarLines() { + //A clean,fast routine for when you just want charts like stock volume charts + //Data must be text-data since I didn't see a graphing need for equally spaced thin lines. + //If you want it - then write to afan@jeo.net and I might add it. + + if ($this->data_type != "data-data") { $this->DrawError('Data Type for ThinBarLines must be data-data'); }; + $y1 = $this->ytr($this->x_axis_position); + + reset($this->data_values); + while (list(, $row) = each($this->data_values)) { + $color_index = 0; + while (list($k, $v) = each($row)) { + if ($k == 0) { + $xlab = $v; + } elseif ($k == 1) { + $xpos = $this->xtr($v); + if ( ($this->draw_x_data_labels == 1) ) { //See "labels_note1 above. + $this->DrawXDataLabel($xlab,$xpos); + } + } else { + if ($color_index >= count($this->ndx_data_color)) $color_index=0; + $barcol = $this->ndx_data_color[$color_index]; + + ImageLine($this->img,$xpos,$y1,$xpos,$this->ytr($v),$barcol); + $color_index++; + } + } + } + + } //function DrawThinBarLines + + function DrawYErrorBar($x_world,$y_world,$error_height,$error_bar_type,$color) { + $x1 = $this->xtr($x_world); + $y1 = $this->ytr($y_world); + $y2 = $this->ytr($y_world+$error_height) ; + + for ($width = 0; $width < $this->error_bar_line_width; $width++) { + ImageLine($this->img, $x1+$width, $y1 , $x1+$width, $y2, $color); + ImageLine($this->img, $x1-$width, $y1 , $x1-$width, $y2, $color); + } + switch ($error_bar_type) { + case "line": + break; + case "tee": + ImageLine($this->img, $x1-$this->error_bar_size, $y2, $x1+$this->error_bar_size, $y2, $color); + break; + default: + ImageLine($this->img, $x1-$this->error_bar_size, $y2, $x1+$this->error_bar_size, $y2, $color); + break; + } + return true; + } + + function DrawDot($x_world,$y_world,$dot_type,$color) { + $half_point = $this->point_size / 2; + $x1 = $this->xtr($x_world) - $half_point; + $x2 = $this->xtr($x_world) + $half_point; + $y1 = $this->ytr($y_world) - $half_point; + $y2 = $this->ytr($y_world) + $half_point; + + switch ($dot_type) { + case "halfline": + ImageFilledRectangle($this->img, $x1, $this->ytr($y_world), $this->xtr($x_world), $this->ytr($y_world), $color); + break; + case "line": + ImageFilledRectangle($this->img, $x1, $this->ytr($y_world), $x2, $this->ytr($y_world), $color); + break; + case "rect": + ImageFilledRectangle($this->img, $x1, $y1, $x2, $y2, $color); + break; + case "circle": + ImageArc($this->img, $x1 + $half_point, $y1 + $half_point, $this->point_size, $this->point_size, 0, 360, $color); + break; + case "dot": + ImageArc($this->img, $x1 + $half_point, $y1 + $half_point, $this->point_size, $this->point_size, 0, 360, $color); + ImageFillToBorder($this->img, $x1 + $half_point, $y1 + $half_point, $color, $color); + break; + case "diamond": + + $arrpoints = array( + $x1,$y1 + $half_point, + $x1 + $half_point, $y1, + $x2,$y1 + $half_point, + $x1 + $half_point, $y2 + ); + + ImageFilledPolygon($this->img, $arrpoints, 4, $color); + break; + case "triangle": + $arrpoints = array( $x1, $y1 + $half_point, + $x2, $y1 + $half_point, + $x1 + $half_point, $y2 + ); + ImageFilledPolygon($this->img, $arrpoints, 3, $color); + break; + default: + ImageFilledRectangle($this->img, $x1, $y1, $x2, $y2, $color); + break; + } + return true; + } + + function SetErrorBarLineWidth($which_seblw) { + $this->error_bar_line_width = $which_seblw; + return true; + } + + + function SetLineWidth($which_lw) { + $this->line_width = $which_lw; + if (!$this->error_bar_line_width) { + $this->error_bar_line_width = $which_lw; + } + return true; + } + + function DrawArea() { + //Data comes in as $data[]=("title",x,y,...); + //Set first and last datapoints of area + $i = 0; + while ($i < $this->records_per_group) { + $posarr[$i][] = $this->xtr($this->min_x); //x initial + $posarr[$i][] = $this->ytr($this->x_axis_position); //y initial + $i++; + } + + reset($this->data_values); + while (list($j, $row) = each($this->data_values)) { + $color_index = 0; + //foreach ($row as $v) + while (list($k, $v) = each($row)) { + if ($k == 0) { + //Draw Data Labels + $xlab = SubStr($v,0,$this->x_datalabel_maxlength); + } elseif ($k == 1) { + $x = $this->xtr($v); + // DrawXDataLabel interferes with Numbers on x-axis + //$this->DrawXDataLabel($xlab,$x); + } else { + // Create Array of points for later + + $y = $this->ytr($v); + $posarr[$color_index][] = $x; + $posarr[$color_index][] = $y; + $color_index++; + } + } + } + + //Final_points + for ($i = 0; $i < $this->records_per_group; $i++) { + $posarr[$i][] = $this->xtr($this->max_x); //x final + $posarr[$i][] = $this->ytr($this->x_axis_position); //y final + } + + $color_index=0; + + //foreach($posarr as $row) + reset($posarr); + while (list(, $row) = each($posarr)) { + if ($color_index >= count($this->ndx_data_color)) $color_index=0; + $barcol = $this->ndx_data_color[$color_index]; +//echo "$row[0],$row[1],$row[2],$row[3],$row[4],$row[5],$row[6],$row[7],$row[8],$row[9],$row[10],$row[11],$row[12], $barcol
"; + ImageFilledPolygon($this->img, $row, (count($row)) / 2, $barcol); + $color_index++; + } +//exit; + + } + + function DrawAreaSeries() { + + //Set first and last datapoints of area + $i = 0; + while ($i < $this->records_per_group) { + $posarr[$i][] = $this->xtr(.5); //x initial + $posarr[$i][] = $this->ytr($this->x_axis_position); //y initial + $i++; + } + + reset($this->data_values); + while (list($j, $row) = each($this->data_values)) { + $color_index = 0; + //foreach ($row as $v) + while (list($k, $v) = each($row)) { + if ($k == 0) { + //Draw Data Labels + $xlab = SubStr($v,0,$this->x_datalabel_maxlength); + $this->DrawXDataLabel($xlab,$this->xtr($j + .5)); + } else { + // Create Array of points for later + + $x = round($this->xtr($j + .5 )); + $y = round($this->ytr($v)); + $posarr[$color_index][] = $x; + $posarr[$color_index][] = $y; + $color_index++; + } + } + } + + //Final_points + for ($i = 0; $i < $this->records_per_group; $i++) { + $posarr[$i][] = round($this->xtr($this->max_x + .5)); //x final + $posarr[$i][] = $this->ytr($this->x_axis_position); //y final + } + + $color_index=0; + + //foreach($posarr as $row) + reset($posarr); + while (list(, $row) = each($posarr)) { + if ($color_index >= count($this->ndx_data_color)) $color_index=0; + $barcol = $this->ndx_data_color[$color_index]; +//echo "$row[0],$row[1],$row[2],$row[3],$row[4],$row[5],$row[6],$row[7],$row[8],$row[9],$row[10],$row[11],$row[12], $barcol
"; + ImageFilledPolygon($this->img, $row, (count($row)) / 2, $barcol); + $color_index++; + } + + } + + function DrawLines() { + //Data comes in as $data[]=("title",x,y,...); + $start_lines = 0; + if ($this->data_type == "text-data") { + $lastx[0] = $this->xtr(0); + $lasty[0] = $this->xtr(0); + } + + //foreach ($this->data_values as $row) + reset($this->data_values); + while (list($j, $row) = each($this->data_values)) { + + $color_index = 0; + $i = 0; + //foreach ($row as $v) + while (list($k, $v) = each($row)) { + if ($k == 0) { + $xlab = SubStr($v,0,$this->x_datalabel_maxlength); + } elseif (($k == 1) && ($this->data_type == "data-data")) { + $x_now = $this->xtr($v); + } else { + //(double) $v; + // Draw Lines + if ($this->data_type == "text-data") { + $x_now = $this->xtr($j+.5); + } + + //if (is_numeric($v)) //PHP4 only + if ((strval($v) != "") ) { //Allow for missing Y data + $y_now = $this->ytr($v); + if ($color_index >= count($this->ndx_data_color)) { $color_index=0;} ; + $barcol = $this->ndx_data_color[$color_index]; + + if ($start_lines == 1) { + for ($width = 0; $width < $this->line_width; $width++) { + if ($this->line_style[$i] == "dashed") { + $this->DrawDashedLine($x_now, $y_now + $width, $lastx[$i], $lasty[$i] + $width, 4,4, $barcol); + } else { + ImageLine($this->img, $x_now, $y_now + $width, $lastx[$i], $lasty[$i] + $width, $barcol); + } + } + } + $lastx[$i] = $x_now; + } else { + $y_now = $lasty[$i]; + //Don't increment lastx[$i] + } + //$bordercol = $this->ndx_data_border_color[$colbarcount]; + + $lasty[$i] = $y_now; + $color_index++; + $i++; + } + //Now we are assured an x_value + if ( ($this->draw_x_data_labels == 1) && ($k == 1) ) { //See "labels_note1 above. + $this->DrawXDataLabel($xlab,$x_now); + } + } //while rows of data + $start_lines = 1; + } + } + + //Data comes in as $data[]=("title",x,y,e+,e-,y2,e2+,e2-,...); + + function DrawLineSeries() { + //This function is replaced by DrawLines + //Tests have shown not much improvement in speed by having separate routines for DrawLineSeries and DrawLines + //For ease of programming I have combined them + return false; + } //function DrawLineSeries + + function DrawDashedLine($x1pix,$y1pix,$x2pix,$y2pix,$dash_length,$dash_space,$color) { + //Code based on work by Ariel Garza and James Pine + //I've decided to have this be in pixels only as a replacement for ImageLine + //$x1pix = $this->xtr($x1); + //$y1pix = $this->ytr($y1); + //$x2pix = $this->xtr($x2); + //$y2pix = $this->ytr($y2); + + // Get the length of the line in pixels + $line_length = ceil (sqrt(pow(($x2pix - $x1pix),2) + pow(($y2pix - $y1pix),2)) ); + + $dx = ($x2pix - $x1pix) / $line_length; + $dy = ($y2pix - $y1pix) / $line_length; + $lastx = $x1pix; + $lasty = $y1pix; + + // Draw the dashed line + for ($i = 0; $i < $line_length; $i += ($dash_length + $dash_space)) { + $xpix = ($dash_length * $dx) + $lastx; + $ypix = ($dash_length * $dy) + $lasty; + + ImageLine($this->img,$lastx,$lasty,$xpix,$ypix,$color); + $lastx = $xpix + ($dash_space * $dx); + $lasty = $ypix + ($dash_space * $dy); + } + } // function DrawDashedLine + + function DrawBars() { + + if ($this->data_type != "text-data") { + $this->DrawError('Bar plots must be text-data: use function SetDataType("text-data")'); + } + + $xadjust = ($this->records_per_group * $this->record_bar_width )/4; + + reset($this->data_values); + while (list($j, $row) = each($this->data_values)) { + + $color_index = 0; + $colbarcount = 0; + $x_now = $this->xtr($j+.5); + + while (list($k, $v) = each($row)) { + if ($k == 0) { + //Draw Data Labels + $xlab = SubStr($v,0,$this->x_datalabel_maxlength); + $this->DrawXDataLabel($xlab,$x_now); + } else { + // Draw Bars ($v) + $x1 = $x_now - $this->data_group_space + ($k-1)*$this->record_bar_width; + $x2 = $x1 + $this->record_bar_width*$this->bar_width_adjust; + + if ($v < $this->x_axis_position) { + $y1 = $this->ytr($this->x_axis_position); + $y2 = $this->ytr($v); + } else { + $y1 = $this->ytr($v); + $y2 = $this->ytr($this->x_axis_position); + } + + if ($color_index >= count($this->ndx_data_color)) $color_index=0; + if ($colbarcount >= count($this->ndx_data_border_color)) $colbarcount=0; + $barcol = $this->ndx_data_color[$color_index]; + $bordercol = $this->ndx_data_border_color[$colbarcount]; + + if ((strval($v) != "") ) { //Allow for missing Y data + if ($this->shading > 0) { + for($i=0;$i<($this->shading);$i++) { + //Shading set in SetDefaultColors + ImageFilledRectangle($this->img, $x1+$i, $y1-$i, $x2+$i, $y2-$i, $this->ndx_i_light); + } + } + + ImageFilledRectangle($this->img, $x1, $y1, $x2, $y2, $barcol); + ImageRectangle($this->img, $x1, $y1, $x2, $y2, $bordercol); + if ($this->draw_data_labels == '1') { //ajo + $y1 = $this->ytr($this->label_scale_position * $v); + //$this->DrawDataLabel($v,$j + .5,$v*$this->label_scale_position); + $this->DrawText($this->x_label_ttffont, $this->x_label_angle, + $x1+$this->record_bar_width/2, $y1, $this->ndx_label_color, $this->x_label_ttffont_size, $v,'center','top'); + } + } + + $color_index++; + $colbarcount++; + } + } + } + } //function DrawBars + + function DrawLegend($which_x1,$which_y1,$which_boxtype) { + //Base code submitted by Marlin Viss + $max_legend_length=0; + reset($this->legend); + while (list(,$leg) = each($this->legend)) { + $len = strlen($leg); + if ($max_legend_length < $len) { + $max_legend_length = $len; + } + } + + $line_spacing = 1.25; + $vert_margin = $this->small_font_height/2 ; + $dot_height = $this->small_font_height*$line_spacing - 1; + + //Upper Left + if ((!$which_x1) || (!$which_y1) ) { + $box_start_x = $this->plot_area[2] - $this->small_font_width*($max_legend_length+4); + $box_start_y = $this->plot_area[1] + 4; + } else { + $box_start_x = $which_x1; + $box_start_y = $which_y1; + } + + //Lower Right + $box_end_y = $box_start_y + $this->small_font_height*(count($this->legend)+1) + 2*$vert_margin; + //$box_end_x = $this->plot_area[2] - 5; + $box_end_x = $box_start_x + $this->small_font_width*($max_legend_length+4) - 5; + + + // Draw box for legend + ImageFilledRectangle($this->img, + $box_start_x, $box_start_y,$box_end_x, + $box_end_y, $this->ndx_bg_color); + ImageRectangle($this->img, + $box_start_x, $box_start_y,$box_end_x, + $box_end_y, $this->ndx_grid_color); + + $color_index=0; + $i = 0; + + + reset($this->legend); + + + while (list(,$leg) = each($this->legend)) { + $y_pos = $box_start_y + $this->small_font_height*($i)*($line_spacing) + $vert_margin; + + ImageString($this->img, $this->small_font, + $box_start_x + $this->small_font_width*( $max_legend_length - strlen($leg) + 1 ) , + $y_pos, + $leg, $this->ndx_text_color); + + if ($color_index >= count($this->ndx_data_color)) $color_index=0; + // Draw a box in the data color + ImageFilledRectangle($this->img, + $box_end_x - $this->small_font_width*2, + $y_pos + 1, $box_end_x - $this->small_font_width, + $y_pos + $dot_height, + $this->ndx_data_color[$color_index]); + + ImageRectangle($this->img, + $box_end_x - $this->small_font_width*2, + $y_pos + 1, $box_end_x - $this->small_font_width, + $y_pos + $dot_height, + $this->ndx_text_color); + $i++; + $color_index++; + } + } //function DrawLegend + + + function DrawGraph() { + + if (($this->img) == "") { + $this->DrawError('No Image Defined: DrawGraph'); + //$this->PHPlot(); + } + + if (! is_array($this->data_values)) { + $this->DrawBackground(); + $this->DrawError("No array of data in \$data_values"); + } else { + if (!$this->data_color) { + $this->SetDataColors(array('blue','green','yellow','red','orange','blue'),array('black')); + } + + $this->FindDataLimits(); //Get maxima and minima for scaling + + $this->SetXLabelHeight(); //Get data for bottom margin + + $this->SetYLabelWidth(); //Get data for left margin + + if (!$this->plot_area_width) { + $this->SetPlotAreaPixels('','','',''); //Set Margins + } + + if (!$this->plot_max_y) { //If not set by user call SetPlotAreaWorld, + $this->SetPlotAreaWorld('','','',''); + } + + if ($this->data_type == "text-data") { + $this->SetEqualXCoord(); + } + + $this->SetPointSize($this->point_size); + + $this->DrawBackground(); + $this->DrawImageBorder(); + + $this->SetTranslation(); + + if ($this->draw_plot_area_background == 1) { + $this->DrawPlotAreaBackground(); + } +//$foo = "$this->max_y, $this->min_y, $new_miny, $new_maxy, $this->x_label_height"; +//ImageString($this->img, 4, 20, 20, $foo, $this->ndx_text_color); + + switch ($this->plot_type) { + case "bars": + $this->DrawPlotBorder(); + $this->DrawLabels(); + $this->DrawBars(); + $this->DrawXAxis(); + break; + case "thinbarline": + $this->DrawPlotBorder(); + $this->DrawLabels(); + $this->DrawThinBarLines(); + break; + case "lines": + $this->DrawPlotBorder(); + $this->DrawLabels(); + if ( $this->data_type == "text-data") { + $this->DrawLines(); + } elseif ( $this->data_type == "data-data-error") { + $this->DrawLinesError(); + } else { + $this->DrawLines(); + } + break; + case "area": + $this->DrawPlotBorder(); + $this->DrawLabels(); + if ( $this->data_type == "text-data") { + $this->DrawAreaSeries(); + } else { + $this->DrawArea(); + } + break; + case "linepoints": + $this->DrawPlotBorder(); + $this->DrawLabels(); + if ( $this->data_type == "text-data") { + $this->DrawLines(); + $this->DrawDots(); + } elseif ( $this->data_type == "data-data-error") { + $this->DrawLinesError(); + $this->DrawDotsError(); + } else { + $this->DrawLines(); + $this->DrawDots(); + } + break; + case "points"; + $this->DrawPlotBorder(); + $this->DrawLabels(); + if ( $this->data_type == "text-data") { + $this->DrawDots(); + } elseif ( $this->data_type == "data-data-error") { + $this->DrawDotsError(); + } else { + $this->DrawDots(); + } + break; + case "pie": + $this->DrawPieChart(); + $this->DrawLabels(); + break; + default: + $this->DrawPlotBorder(); + $this->DrawLabels(); + $this->DrawBars(); + break; + } + + if ($this->legend) { + $this->DrawLegend($this->legend_x_pos,$this->legend_y_pos,''); + } + + } + if ($this->print_image == 1) { + $this->PrintImage(); + } + } //function DrawGraph + + } // $graph = new PHPlot;