1
|
|
|
<?php |
2
|
|
|
/* |
3
|
|
|
$Id$ |
4
|
|
|
|
5
|
|
|
osCommerce, Open Source E-Commerce Solutions |
6
|
|
|
http://www.oscommerce.com |
7
|
|
|
|
8
|
|
|
Copyright (c) 2003 osCommerce |
9
|
|
|
|
10
|
|
|
Released under the GNU General Public License |
11
|
|
|
|
12
|
|
|
PHPLOT 4.4.6 Copyright (c) 1998-2001 Afan Ottenheimer |
13
|
|
|
*/ |
14
|
|
|
|
15
|
|
|
class PHPlot{ |
16
|
|
|
|
17
|
|
|
var $is_inline = 0; //0 = Sends headers, 1 = sends just raw image data |
18
|
|
|
var $browser_cache = '1'; // 0 = Sends headers for browser to not cache the image, (i.e. 0 = don't let browser cache image) |
19
|
|
|
// (only if is_inline = 0 also) |
20
|
|
|
var $session_set = ''; //Do not change |
21
|
|
|
var $scale_is_set = ''; //Do not change |
22
|
|
|
var $draw_plot_area_background = ''; |
23
|
|
|
|
24
|
|
|
var $image_width; //Total Width in Pixels |
25
|
|
|
var $image_height; //Total Height in Pixels |
26
|
|
|
var $image_border_type = ''; //raised, plain, '' |
27
|
|
|
var $x_left_margin; |
28
|
|
|
var $y_top_margin; |
29
|
|
|
var $x_right_margin; |
30
|
|
|
var $y_bot_margin; |
31
|
|
|
var $plot_area = array(5,5,600,400); |
32
|
|
|
var $x_axis_position = 0; //Where to draw the X_axis (world coordinates) |
33
|
|
|
var $y_axis_position = ''; //Leave blank for Y axis at left of plot. (world coord.) |
34
|
|
|
var $xscale_type = 'linear'; //linear or log |
35
|
|
|
var $yscale_type = 'linear'; |
36
|
|
|
|
37
|
|
|
//Use for multiple plots per image |
38
|
|
|
var $print_image = 1; //Used for multiple charts per image. |
39
|
|
|
|
40
|
|
|
//Fonts |
41
|
|
|
var $use_ttf = 0; //Use TTF fonts (1) or not (0) |
42
|
|
|
var $font_path = './'; //To be added |
43
|
|
|
var $font = './benjamingothic.ttf'; |
44
|
|
|
|
45
|
|
|
///////////Fonts: Small/Generic |
46
|
|
|
var $small_ttffont_size = 12; // |
47
|
|
|
//non-ttf |
48
|
|
|
var $small_font = 2; // fonts = 1,2,3,4 or 5 |
49
|
|
|
var $small_font_width = 6.0; // width in pixels (2=6,3=8,4=8) |
50
|
|
|
var $small_font_height = 8.0; // height in pixels (2=8,3=10,4=12) |
51
|
|
|
|
52
|
|
|
////////// Fonts:Title |
53
|
|
|
var $title_ttffont = './benjamingothic.ttf'; |
54
|
|
|
var $title_ttffont_size = 14; |
55
|
|
|
var $title_angle= 0; |
56
|
|
|
//non-ttf |
57
|
|
|
var $title_font = '4'; // fonts = 1,2,3,4,5 |
58
|
|
|
|
59
|
|
|
////////////// Fonts:Axis |
60
|
|
|
var $axis_ttffont = './benjamingothic.ttf'; |
61
|
|
|
var $axis_ttffont_size = 8; |
62
|
|
|
var $x_datalabel_angle = 0; |
63
|
|
|
//non-ttf |
64
|
|
|
var $axis_font = 2; |
65
|
|
|
|
66
|
|
|
////////////////Fonts:Labels of Data |
67
|
|
|
var $datalabel_font = '2'; |
68
|
|
|
|
69
|
|
|
//////////////// Fonts:Labels (Axis Titles) |
70
|
|
|
var $x_label_ttffont = './benjamingothic.ttf'; |
71
|
|
|
var $x_label_ttffont_size = '12'; |
72
|
|
|
var $x_label_angle = '0'; |
73
|
|
|
|
74
|
|
|
var $y_label_ttffont = './benjamingothic.ttf'; |
75
|
|
|
var $y_label_ttffont_size = '12'; |
76
|
|
|
var $y_label_angle = 90; |
77
|
|
|
var $y_label_width = ''; |
78
|
|
|
|
79
|
|
|
//Formats |
80
|
|
|
var $file_format = 'png'; |
81
|
|
|
var $file_name = ''; //For output to a file instead of stdout |
82
|
|
|
|
83
|
|
|
//Plot Colors |
84
|
|
|
var $shading = 0; |
85
|
|
|
var $color_array = 1; //1 = include small list |
86
|
|
|
//2 = include large list |
87
|
|
|
//array = define your own color translation. See rgb.inc.php and SetRGBArray |
88
|
|
|
var $bg_color; |
89
|
|
|
var $plot_bg_color; |
90
|
|
|
var $grid_color; |
91
|
|
|
var $light_grid_color; |
92
|
|
|
var $tick_color; |
93
|
|
|
var $title_color; |
94
|
|
|
var $label_color; |
95
|
|
|
var $text_color; |
96
|
|
|
var $i_light = ''; |
97
|
|
|
|
98
|
|
|
//Data |
99
|
|
|
var $data_type = 'text-data'; //text-data, data-data-error, data-data |
100
|
|
|
var $plot_type= 'linepoints'; //bars, lines, linepoints, area, points, pie, thinbarline |
101
|
|
|
var $line_width = 2; |
102
|
|
|
var $line_style = array('solid','solid','solid','dashed','dashed','solid'); //Solid or dashed lines |
103
|
|
|
|
104
|
|
|
var $data_color = ''; //array('blue','green','yellow',array(0,0,0)); |
105
|
|
|
var $data_border_color = ''; |
106
|
|
|
|
107
|
|
|
var $label_scale_position = '.5'; //1 = top, 0 = bottom |
108
|
|
|
var $group_frac_width = '.7'; //value from 0 to 1 = width of bar |
109
|
|
|
var $bar_width_adjust = '1'; //1 = bars of normal width, must be > 0 |
110
|
|
|
|
111
|
|
|
var $point_size = 10; |
112
|
|
|
var $point_shape = 'diamond'; //rect,circle,diamond,triangle,dot,line,halfline |
113
|
|
|
var $error_bar_shape = 'tee'; //tee, line |
114
|
|
|
var $error_bar_size = 5; //right left size of tee |
115
|
|
|
var $error_bar_line_width = ''; //If set then use it, else use $line_width for thickness |
116
|
|
|
var $error_bar_color = ''; |
117
|
|
|
var $data_values; |
118
|
|
|
|
119
|
|
|
var $plot_border_type = 'full'; //left, none, full |
120
|
|
|
var $plot_area_width = ''; |
121
|
|
|
var $number_x_points; |
122
|
|
|
var $plot_min_x; // Max and min of the plot area |
123
|
|
|
var $plot_max_x= ''; // Max and min of the plot area |
124
|
|
|
var $plot_min_y= ''; // Max and min of the plot area |
125
|
|
|
var $plot_max_y = ''; // Max and min of the plot area |
126
|
|
|
var $min_y = ''; |
127
|
|
|
var $max_y = ''; |
128
|
|
|
var $max_x = 10; //Must not be = 0; |
129
|
|
|
var $y_precision = '1'; |
130
|
|
|
var $x_precision = '1'; |
131
|
|
|
var $si_units = ''; |
132
|
|
|
|
133
|
|
|
//Labels |
134
|
|
|
var $draw_data_labels = '0'; |
135
|
|
|
var $legend = ''; //an array |
136
|
|
|
var $legend_x_pos = ''; |
137
|
|
|
var $legend_y_pos = ''; |
138
|
|
|
var $title_txt = ""; |
139
|
|
|
var $y_label_txt = ''; |
140
|
|
|
var $x_label_txt = ""; |
141
|
|
|
|
142
|
|
|
//DataAxis Labels (on each axis) |
143
|
|
|
var $y_grid_label_type = 'data'; //data, none, time, other |
144
|
|
|
var $y_grid_label_pos = 'plotleft'; //plotleft, plotright, yaxis, both |
145
|
|
|
var $x_grid_label_type = 'data'; //data, title, none, time, other |
146
|
|
|
var $draw_x_data_labels = ''; // 0=false, 1=true, ""=let program decide |
147
|
|
|
var $x_time_format = "%H:%m:%s"; //See http://www.php.net/manual/html/function.strftime.html |
148
|
|
|
var $x_datalabel_maxlength = 10; |
149
|
|
|
|
150
|
|
|
//Tick Formatting |
151
|
|
|
var $tick_length = '10'; //pixels: tick length from axis left/downward |
152
|
|
|
//tick_length2 to be implemented |
153
|
|
|
//var $tick_length2 = ''; //pixels: tick length from axis line rightward/upward |
154
|
|
|
var $draw_vert_ticks = 1; //1 = draw ticks, 0 = don't draw ticks |
155
|
|
|
var $num_vert_ticks = ''; |
156
|
|
|
var $vert_tick_increment=''; //Set num_vert_ticks or vert_tick_increment, not both. |
157
|
|
|
var $vert_tick_position = 'both'; //plotright=(right of plot only), plotleft=(left of plot only), |
158
|
|
|
//both = (both left and right of plot), yaxis=(crosses y axis) |
159
|
|
|
var $horiz_tick_increment=''; //Set num_horiz_ticks or horiz_tick_increment, not both. |
160
|
|
|
var $num_horiz_ticks=''; |
161
|
|
|
var $skip_top_tick = '0'; |
162
|
|
|
var $skip_bottom_tick = '0'; |
163
|
|
|
|
164
|
|
|
//Grid Formatting |
165
|
|
|
var $draw_x_grid = 0; |
166
|
|
|
var $draw_y_grid = 1; |
167
|
|
|
|
168
|
|
|
|
169
|
|
|
//BEGIN CODE |
170
|
|
|
////////////////////////////////////////////////////// |
171
|
|
|
//Constructor: Setup Img pointer, Colors and Size of Image |
172
|
|
|
function PHPlot($which_width=600,$which_height=400,$which_output_file="",$which_input_file="") { |
173
|
|
|
|
174
|
|
|
$this->SetRGBArray('2'); |
175
|
|
|
$this->background_done = 0; //Set to 1 after background image first drawn |
|
|
|
|
176
|
|
|
|
177
|
|
|
if ($which_output_file != "") { $this->SetOutputFile($which_output_file); }; |
178
|
|
|
|
179
|
|
|
if ($which_input_file != "") { |
180
|
|
|
$this->SetInputFile($which_input_file) ; |
181
|
|
|
} else { |
182
|
|
|
$this->SetImageArea($which_width, $which_height); |
183
|
|
|
$this->InitImage(); |
184
|
|
|
} |
185
|
|
|
|
186
|
|
|
if ( ($this->session_set == 1) && ($this->img == "") ) { //For sessions |
|
|
|
|
187
|
|
|
//Do nothing |
188
|
|
|
} else { |
189
|
|
|
$this->SetDefaultColors(); |
190
|
|
|
} |
191
|
|
|
|
192
|
|
|
$this->SetIndexColors(); |
193
|
|
|
|
194
|
|
|
} |
195
|
|
|
|
196
|
|
|
//Set up the image and colors |
197
|
|
|
function InitImage() { |
198
|
|
|
//if ($this->img) { |
199
|
|
|
// ImageDestroy($this->img); |
200
|
|
|
//} |
201
|
|
|
$this->img = ImageCreate($this->image_width, $this->image_height); |
202
|
|
|
return true; |
203
|
|
|
} |
204
|
|
|
|
205
|
|
|
function SetBrowserCache($which_browser_cache) { //Submitted by Thiemo Nagel |
206
|
|
|
$this->browser_cache = $which_browser_cache; |
207
|
|
|
return true; |
208
|
|
|
} |
209
|
|
|
|
210
|
|
|
function SetPrintImage($which_pi) { |
211
|
|
|
$this->print_image = $which_pi; |
212
|
|
|
return true; |
213
|
|
|
} |
214
|
|
|
|
215
|
|
|
function SetIsInline($which_ii) { |
216
|
|
|
$this->is_inline = $which_ii; |
217
|
|
|
return true; |
218
|
|
|
} |
219
|
|
|
|
220
|
|
|
function SetUseTTF($which_ttf) { |
221
|
|
|
$this->use_ttf = $which_ttf; |
222
|
|
|
return true; |
223
|
|
|
} |
224
|
|
|
|
225
|
|
|
function SetTitleFontSize($which_tfs) { |
226
|
|
|
//TTF |
227
|
|
|
$this->title_ttffont_size = $which_tfs; //pt size |
228
|
|
|
|
229
|
|
|
//Non-TTF settings |
230
|
|
|
if (($which_tfs > 5) && (!$this->use_ttf)) { |
231
|
|
|
$this->DrawError('Non-TTF font size must be 1,2,3,4 or 5'); |
232
|
|
|
return false; |
233
|
|
|
} else { |
234
|
|
|
$this->title_font = $which_tfs; |
235
|
|
|
//$this->title_font_height = ImageFontHeight($which_tfs) // height in pixels |
236
|
|
|
//$this->title_font_width = ImageFontWidth($which_tfs); // width in pixels |
237
|
|
|
} |
238
|
|
|
return true; |
239
|
|
|
} |
240
|
|
|
|
241
|
|
|
function SetLineStyles($which_sls){ |
242
|
|
|
$this->line_style = $which_sls; |
243
|
|
|
return true; |
244
|
|
|
} |
245
|
|
|
|
246
|
|
|
function SetLegend($which_leg){ |
247
|
|
|
if (is_array($which_leg)) { |
248
|
|
|
$this->legend = $which_leg; |
|
|
|
|
249
|
|
|
return true; |
250
|
|
|
} else { |
251
|
|
|
$this->DrawError('Error: SetLegend argument must be an array'); |
252
|
|
|
return false; |
253
|
|
|
} |
254
|
|
|
} |
255
|
|
|
|
256
|
|
|
function SetLegendPixels($which_x,$which_y,$which_type) { |
|
|
|
|
257
|
|
|
//which_type not yet used |
258
|
|
|
$this->legend_x_pos = $which_x; |
259
|
|
|
$this->legend_y_pos = $which_y; |
260
|
|
|
return true; |
261
|
|
|
} |
262
|
|
|
|
263
|
|
|
function SetLegendWorld($which_x,$which_y,$which_type='') { |
|
|
|
|
264
|
|
|
//which_type not yet used |
265
|
|
|
//Must be called after scales are set up. |
266
|
|
|
if ($this->scale_is_set != 1) { $this->SetTranslation(); }; |
267
|
|
|
$this->legend_x_pos = $this->xtr($which_x); |
|
|
|
|
268
|
|
|
$this->legend_y_pos = $this->ytr($which_y); |
|
|
|
|
269
|
|
|
return true; |
270
|
|
|
} |
271
|
|
|
/* *************************************** |
272
|
|
|
function SetFileFormat($which_file_format) { //Only works with PHP4 |
273
|
|
|
$asked = strtolower($which_file_format); |
274
|
|
|
if( $asked =="jpg" || $asked =="png" || $asked =="gif" || $asked =="wbmp" ) { |
275
|
|
|
if( $asked=="jpg" && !(imagetypes() & IMG_JPG) ) |
276
|
|
|
return false; |
277
|
|
|
elseif( $asked=="png" && !(imagetypes() & IMG_PNG) ) |
278
|
|
|
return false; |
279
|
|
|
elseif( $asked=="gif" && !(imagetypes() & IMG_GIF) ) |
280
|
|
|
return false; |
281
|
|
|
elseif( $asked=="wbmp" && !(imagetypes() & IMG_WBMP) ) |
282
|
|
|
return false; |
283
|
|
|
else { |
284
|
|
|
$this->img_format=$asked; |
285
|
|
|
return true; |
286
|
|
|
} |
287
|
|
|
} |
288
|
|
|
else |
289
|
|
|
return false; |
290
|
|
|
} |
291
|
|
|
|
292
|
|
|
*************************************** */ |
293
|
|
|
function SetFileFormat($which_file_format) { |
294
|
|
|
//eventually test to see if that is supported - if not then return false |
295
|
|
|
$asked = strtolower(trim($which_file_format)); |
296
|
|
|
if( ($asked=='jpg') || ($asked=='png') || ($asked=='gif') || ($asked=='wbmp') ) { |
297
|
|
|
$this->file_format = $asked; |
298
|
|
|
return true; |
299
|
|
|
} else { |
300
|
|
|
return false; |
301
|
|
|
} |
302
|
|
|
} |
303
|
|
|
|
304
|
|
|
function SetInputFile($which_input_file) { |
305
|
|
|
//$this->SetFileFormat($which_frmt); |
306
|
|
|
$size = GetImageSize($which_input_file); |
307
|
|
|
$input_type = $size[2]; |
308
|
|
|
|
309
|
|
|
switch($input_type) { //After SetFileFormat is in lower case |
310
|
|
|
case "1": |
311
|
|
|
$im = @ImageCreateFromGIF ($which_input_file); |
312
|
|
|
if (!$im) { // See if it failed |
313
|
|
|
$this->PrintError("Unable to open $which_input_file as a GIF"); |
314
|
|
|
return false; |
315
|
|
|
} |
316
|
|
|
break; |
317
|
|
|
case "3": |
318
|
|
|
$im = @ImageCreateFromPNG ($which_input_file); |
319
|
|
|
if (!$im) { // See if it failed |
320
|
|
|
$this->PrintError("Unable to open $which_input_file as a PNG"); |
321
|
|
|
return false; |
322
|
|
|
} |
323
|
|
|
break; |
324
|
|
|
case "2": |
325
|
|
|
$im = @ImageCreateFromJPEG ($which_input_file); |
326
|
|
|
if (!$im) { // See if it failed |
327
|
|
|
$this->PrintError("Unable to open $which_input_file as a JPG"); |
328
|
|
|
return false; |
329
|
|
|
} |
330
|
|
|
break; |
331
|
|
|
default: |
332
|
|
|
$this->PrintError('Please select wbmp,gif,jpg, or png for image type!'); |
333
|
|
|
return false; |
334
|
|
|
break; |
|
|
|
|
335
|
|
|
} |
336
|
|
|
|
337
|
|
|
//Get Width and Height of Image |
338
|
|
|
$this->SetImageArea($size[0],$size[1]); |
339
|
|
|
|
340
|
|
|
$this->img = $im; |
341
|
|
|
|
342
|
|
|
return true; |
343
|
|
|
|
344
|
|
|
} |
345
|
|
|
|
346
|
|
|
function SetOutputFile($which_output_file) { |
347
|
|
|
$this->output_file = $which_output_file; |
|
|
|
|
348
|
|
|
return true; |
349
|
|
|
} |
350
|
|
|
|
351
|
|
|
function SetImageArea($which_iw,$which_ih) { |
352
|
|
|
//Note this is now an Internal function - please set w/h via PHPlot() |
353
|
|
|
$this->image_width = $which_iw; |
354
|
|
|
$this->image_height = $which_ih; |
355
|
|
|
|
356
|
|
|
return true; |
357
|
|
|
} |
358
|
|
|
|
359
|
|
|
|
360
|
|
|
function SetYAxisPosition($which_pos) { |
361
|
|
|
$this->y_axis_position = $which_pos; |
362
|
|
|
return true; |
363
|
|
|
} |
364
|
|
|
function SetXAxisPosition($which_pos) { |
365
|
|
|
$this->x_axis_position = $which_pos; |
366
|
|
|
return true; |
367
|
|
|
} |
368
|
|
|
function SetXTimeFormat($which_xtf) { |
369
|
|
|
$this->x_time_format = $which_xtf; |
370
|
|
|
return true; |
371
|
|
|
} |
372
|
|
|
function SetXDataLabelMaxlength($which_xdlm) { |
373
|
|
|
if ($which_xdlm >0 ) { |
374
|
|
|
$this->x_datalabel_maxlength = $which_xdlm; |
375
|
|
|
return true; |
376
|
|
|
} else { |
377
|
|
|
return false; |
378
|
|
|
} |
379
|
|
|
} |
380
|
|
|
function SetXDataLabelAngle($which_xdla) { |
381
|
|
|
$this->x_datalabel_angle = $which_xdla; |
382
|
|
|
return true; |
383
|
|
|
} |
384
|
|
|
function SetXScaleType($which_xst) { |
385
|
|
|
$this->xscale_type = $which_xst; |
386
|
|
|
return true; |
387
|
|
|
} |
388
|
|
|
function SetYScaleType($which_yst) { |
389
|
|
|
$this->yscale_type = $which_yst; |
390
|
|
|
if ($this->x_axis_position <= 0) { |
391
|
|
|
$this->x_axis_position = 1; |
392
|
|
|
} |
393
|
|
|
return true; |
394
|
|
|
} |
395
|
|
|
|
396
|
|
|
function SetPrecisionX($which_prec) { |
397
|
|
|
$this->x_precision = $which_prec; |
398
|
|
|
return true; |
399
|
|
|
} |
400
|
|
|
function SetPrecisionY($which_prec) { |
401
|
|
|
$this->y_precision = $which_prec; |
402
|
|
|
return true; |
403
|
|
|
} |
404
|
|
|
|
405
|
|
|
|
406
|
|
|
function SetIndexColors() { //Internal Method called to set colors and preserve state |
407
|
|
|
//These are the colors of the image that are used. They are initialized |
408
|
|
|
//to work with sessions and PHP. |
409
|
|
|
|
410
|
|
|
$this->ndx_i_light = $this->SetIndexColor($this->i_light); |
|
|
|
|
411
|
|
|
$this->ndx_i_dark = $this->SetIndexColor($this->i_dark); |
|
|
|
|
412
|
|
|
$this->ndx_bg_color= $this->SetIndexColor($this->bg_color); |
|
|
|
|
413
|
|
|
$this->ndx_plot_bg_color= $this->SetIndexColor($this->plot_bg_color); |
|
|
|
|
414
|
|
|
|
415
|
|
|
$this->ndx_title_color= $this->SetIndexColor($this->title_color); |
|
|
|
|
416
|
|
|
$this->ndx_tick_color= $this->SetIndexColor($this->tick_color); |
|
|
|
|
417
|
|
|
$this->ndx_label_color= $this->SetIndexColor($this->label_color); |
|
|
|
|
418
|
|
|
$this->ndx_text_color= $this->SetIndexColor($this->text_color); |
|
|
|
|
419
|
|
|
$this->ndx_light_grid_color= $this->SetIndexColor($this->light_grid_color); |
|
|
|
|
420
|
|
|
$this->ndx_grid_color= $this->SetIndexColor($this->grid_color); |
|
|
|
|
421
|
|
|
|
422
|
|
|
unset($ndx_error_bar_color); |
423
|
|
|
$i = 0; |
424
|
|
|
foreach ($this->error_bar_color as $col) { |
|
|
|
|
425
|
|
|
$this->ndx_error_bar_color[$i] = $this->SetIndexColor($col); |
|
|
|
|
426
|
|
|
$i++; |
427
|
|
|
} |
428
|
|
|
|
429
|
|
|
unset($ndx_data_border_color); |
430
|
|
|
$i = 0; |
431
|
|
|
foreach ($this->data_border_color as $col) { |
|
|
|
|
432
|
|
|
$this->ndx_data_border_color[$i] = $this->SetIndexColor($col); |
|
|
|
|
433
|
|
|
$i++; |
434
|
|
|
} |
435
|
|
|
|
436
|
|
|
unset($ndx_data_color); |
437
|
|
|
$i = 0; |
438
|
|
|
foreach ($this->data_color as $col) { |
|
|
|
|
439
|
|
|
$this->ndx_data_color[$i] = $this->SetIndexColor($col); |
|
|
|
|
440
|
|
|
$i++; |
441
|
|
|
} |
442
|
|
|
|
443
|
|
|
return true; |
444
|
|
|
} |
445
|
|
|
|
446
|
|
|
|
447
|
|
|
function SetDefaultColors() { |
448
|
|
|
|
449
|
|
|
$this->i_light = array(194,194,194); |
|
|
|
|
450
|
|
|
$this->i_dark = array(100,100,100); |
|
|
|
|
451
|
|
|
$this->SetPlotBgColor(array(222,222,222)); |
452
|
|
|
$this->SetBackgroundColor(array(200,222,222)); //can use rgb values or "name" values |
453
|
|
|
$this->SetLabelColor('black'); |
454
|
|
|
$this->SetTextColor('black'); |
455
|
|
|
$this->SetGridColor('black'); |
456
|
|
|
$this->SetLightGridColor(array(175,175,175)); |
457
|
|
|
$this->SetTickColor('black'); |
458
|
|
|
$this->SetTitleColor(array(0,0,0)); // Can be array or name |
459
|
|
|
$this->data_color = array('blue','green','yellow','red','orange'); |
|
|
|
|
460
|
|
|
$this->error_bar_color = array('blue','green','yellow','red','orange'); |
|
|
|
|
461
|
|
|
$this->data_border_color = array('black'); |
|
|
|
|
462
|
|
|
|
463
|
|
|
$this->session_set = 1; //Mark it down for PHP session() usage. |
|
|
|
|
464
|
|
|
} |
465
|
|
|
|
466
|
|
|
function PrintImage() { |
467
|
|
|
|
468
|
|
|
if ( ($this->browser_cache == 0) && ($this->is_inline == 0)) { //Submitted by Thiemo Nagel |
469
|
|
|
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); |
470
|
|
|
header('Last-Modified: ' . gmdate("D, d M Y H:i:s") . 'GMT'); |
471
|
|
|
header('Cache-Control: no-cache, must-revalidate'); |
472
|
|
|
header('Pragma: no-cache'); |
473
|
|
|
} |
474
|
|
|
|
475
|
|
|
switch($this->file_format) { |
476
|
|
View Code Duplication |
case "png": |
|
|
|
|
477
|
|
|
if ($this->is_inline == 0) { |
478
|
|
|
Header('Content-type: image/png'); |
479
|
|
|
} |
480
|
|
|
if ($this->is_inline == 1 && $this->output_file != "") { |
481
|
|
|
ImagePng($this->img,$this->output_file); |
482
|
|
|
} else { |
483
|
|
|
ImagePng($this->img); |
484
|
|
|
} |
485
|
|
|
break; |
486
|
|
View Code Duplication |
case "jpg": |
|
|
|
|
487
|
|
|
if ($this->is_inline == 0) { |
488
|
|
|
Header('Content-type: image/jpeg'); |
489
|
|
|
} |
490
|
|
|
if ($this->is_inline == 1 && $this->output_file != "") { |
491
|
|
|
ImageJPEG($this->img,$this->output_file); |
492
|
|
|
} else { |
493
|
|
|
ImageJPEG($this->img); |
494
|
|
|
} |
495
|
|
|
break; |
496
|
|
View Code Duplication |
case "gif": |
|
|
|
|
497
|
|
|
if ($this->is_inline == 0) { |
498
|
|
|
Header('Content-type: image/gif'); |
499
|
|
|
} |
500
|
|
|
if ($this->is_inline == 1 && $this->output_file != "") { |
501
|
|
|
ImageGIF($this->img,$this->output_file); |
502
|
|
|
} else { |
503
|
|
|
ImageGIF($this->img); |
504
|
|
|
} |
505
|
|
|
|
506
|
|
|
break; |
507
|
|
View Code Duplication |
case "wbmp": |
|
|
|
|
508
|
|
|
if ($this->is_inline == 0) { |
509
|
|
|
Header('Content-type: image/wbmp'); |
510
|
|
|
} |
511
|
|
|
if ($this->is_inline == 1 && $this->output_file != "") { |
512
|
|
|
ImageWBMP($this->img,$this->output_file); |
513
|
|
|
} else { |
514
|
|
|
ImageWBMP($this->img); |
515
|
|
|
} |
516
|
|
|
|
517
|
|
|
break; |
518
|
|
|
default: |
519
|
|
|
$this->PrintError('Please select an image type!<br />'); |
520
|
|
|
break; |
521
|
|
|
} |
522
|
|
|
ImageDestroy($this->img); |
523
|
|
|
return true; |
524
|
|
|
} |
525
|
|
|
|
526
|
|
|
|
527
|
|
|
function DrawBackground() { |
528
|
|
|
//if ($this->img == "") { $this->InitImage(); }; |
529
|
|
|
if ($this->background_done == 0) { //Don't draw it twice if drawing two plots on one image |
530
|
|
|
ImageFilledRectangle($this->img, 0, 0, |
531
|
|
|
$this->image_width, $this->image_height, $this->ndx_bg_color); |
|
|
|
|
532
|
|
|
$this->background_done = 1; |
533
|
|
|
} |
534
|
|
|
return true; |
535
|
|
|
} |
536
|
|
|
|
537
|
|
|
function DrawImageBorder() { |
538
|
|
|
switch ($this->image_border_type) { |
539
|
|
|
case "raised": |
540
|
|
|
ImageLine($this->img,0,0,$this->image_width-1,0,$this->ndx_i_light); |
|
|
|
|
541
|
|
|
ImageLine($this->img,1,1,$this->image_width-2,1,$this->ndx_i_light); |
|
|
|
|
542
|
|
|
ImageLine($this->img,0,0,0,$this->image_height-1,$this->ndx_i_light); |
|
|
|
|
543
|
|
|
ImageLine($this->img,1,1,1,$this->image_height-2,$this->ndx_i_light); |
|
|
|
|
544
|
|
|
ImageLine($this->img,$this->image_width-1,0,$this->image_width-1,$this->image_height-1,$this->ndx_i_dark); |
545
|
|
|
ImageLine($this->img,0,$this->image_height-1,$this->image_width-1,$this->image_height-1,$this->ndx_i_dark); |
546
|
|
|
ImageLine($this->img,$this->image_width-2,1,$this->image_width-2,$this->image_height-2,$this->ndx_i_dark); |
547
|
|
|
ImageLine($this->img,1,$this->image_height-2,$this->image_width-2,$this->image_height-2,$this->ndx_i_dark); |
548
|
|
|
break; |
549
|
|
|
case "plain": |
550
|
|
|
ImageLine($this->img,0,0,$this->image_width,0,$this->ndx_i_dark); |
551
|
|
|
ImageLine($this->img,$this->image_width-1,0,$this->image_width-1,$this->image_height,$this->ndx_i_dark); |
552
|
|
|
ImageLine($this->img,$this->image_width-1,$this->image_height-1,0,$this->image_height-1,$this->ndx_i_dark); |
553
|
|
|
ImageLine($this->img,0,0,0,$this->image_height,$this->ndx_i_dark); |
554
|
|
|
break; |
555
|
|
|
default: |
556
|
|
|
break; |
557
|
|
|
} |
558
|
|
|
return true; |
559
|
|
|
} |
560
|
|
|
|
561
|
|
|
function SetPlotBorderType($which_pbt) { |
562
|
|
|
$this->plot_border_type = $which_pbt; //left, none, anything else=full |
563
|
|
|
} |
564
|
|
|
|
565
|
|
|
function SetImageBorderType($which_sibt) { |
566
|
|
|
$this->image_border_type = $which_sibt; //raised, plain |
567
|
|
|
} |
568
|
|
|
|
569
|
|
|
function SetDrawPlotAreaBackground($which_dpab) { |
570
|
|
|
$this->draw_plot_area_background = $which_dpab; // 1=true or anything else=false |
571
|
|
|
} |
572
|
|
|
|
573
|
|
|
function SetDrawDataLabels($which_ddl) { //Draw next to datapoints |
574
|
|
|
$this->draw_data_labels = $which_ddl; // 1=true or anything else=false |
575
|
|
|
} |
576
|
|
|
|
577
|
|
|
function SetDrawXDataLabels($which_dxdl) { //Draw on X Axis |
578
|
|
|
$this->draw_x_data_labels = $which_dxdl; // 1=true or anything else=false |
579
|
|
|
} |
580
|
|
|
|
581
|
|
|
function SetDrawYGrid($which_dyg) { |
582
|
|
|
$this->draw_y_grid = $which_dyg; // 1=true or anything else=false |
583
|
|
|
} |
584
|
|
|
|
585
|
|
|
function SetDrawXGrid($which_dxg) { |
586
|
|
|
$this->draw_x_grid = $which_dxg; // 1=true or anything else=false |
587
|
|
|
} |
588
|
|
|
|
589
|
|
|
function SetYGridLabelType($which_yglt) { |
590
|
|
|
$this->y_grid_label_type = $which_yglt; |
591
|
|
|
return true; |
592
|
|
|
} |
593
|
|
|
|
594
|
|
|
function SetXGridLabelType($which_xglt) { |
595
|
|
|
$this->x_grid_label_type = $which_xglt; |
596
|
|
|
return true; |
597
|
|
|
} |
598
|
|
|
|
599
|
|
|
function SetXLabel($xlbl) { |
600
|
|
|
$this->x_label_txt = $xlbl; |
601
|
|
|
return true; |
602
|
|
|
} |
603
|
|
|
function SetYLabel($ylbl) { |
604
|
|
|
$this->y_label_txt = $ylbl; |
605
|
|
|
return true; |
606
|
|
|
} |
607
|
|
|
function SetTitle($title) { |
608
|
|
|
$this->title_txt = $title; |
609
|
|
|
return true; |
610
|
|
|
} |
611
|
|
|
|
612
|
|
|
//function SetLabels($xlbl,$ylbl,$title) { |
613
|
|
|
// $this->title_txt = $title; |
614
|
|
|
// $this->x_label_txt = $xlbl; |
615
|
|
|
// $this->y_label_txt = $ylbl; |
616
|
|
|
//} |
617
|
|
|
|
618
|
|
|
function DrawLabels() { |
619
|
|
|
$this->DrawTitle(); |
620
|
|
|
$this->DrawXLabel(); |
621
|
|
|
$this->DrawYLabel(); |
622
|
|
|
return true; |
623
|
|
|
} |
624
|
|
|
|
625
|
|
|
function DrawXLabel() { |
626
|
|
|
if ($this->use_ttf == 1) { |
627
|
|
|
$xpos = $this->xtr(($this->plot_max_x + $this->plot_min_x)/2.0) ; |
628
|
|
|
$ypos = $this->ytr($this->plot_min_y) + $this->x_label_height/2.0; |
|
|
|
|
629
|
|
|
$this->DrawText($this->x_label_ttffont, $this->x_label_angle, |
630
|
|
|
$xpos, $ypos, $this->ndx_label_color, $this->x_label_ttffont_size, $this->x_label_txt,'center'); |
|
|
|
|
631
|
|
View Code Duplication |
} else { |
|
|
|
|
632
|
|
|
//$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) ; |
633
|
|
|
$xpos = 0.0 + $this->xtr(($this->plot_max_x+$this->plot_min_x)/2.0) ; |
634
|
|
|
$ypos = ($this->ytr($this->plot_min_y) + $this->x_label_height/2); |
635
|
|
|
|
636
|
|
|
$this->DrawText($this->small_font, $this->x_label_angle, |
637
|
|
|
$xpos, $ypos, $this->ndx_label_color, "", $this->x_label_txt, 'center'); |
|
|
|
|
638
|
|
|
|
639
|
|
|
} |
640
|
|
|
return true; |
641
|
|
|
} |
642
|
|
|
|
643
|
|
|
function DrawYLabel() { |
644
|
|
|
if ($this->use_ttf == 1) { |
645
|
|
|
$size = $this->TTFBBoxSize($this->y_label_ttffont_size, 90, $this->y_label_ttffont, $this->y_label_txt); |
646
|
|
|
$xpos = 8 + $size[0]; |
647
|
|
|
$ypos = ($size[1])/2 + $this->ytr(($this->plot_max_y + $this->plot_min_y)/2.0) ; |
648
|
|
|
$this->DrawText($this->y_label_ttffont, 90, |
649
|
|
|
$xpos, $ypos, $this->ndx_label_color, $this->y_label_ttffont_size, $this->y_label_txt); |
|
|
|
|
650
|
|
View Code Duplication |
} else { |
|
|
|
|
651
|
|
|
$xpos = 8; |
652
|
|
|
$ypos = (($this->small_font_width*strlen($this->y_label_txt)/2.0) + |
653
|
|
|
$this->ytr(($this->plot_max_y + $this->plot_min_y)/2.0) ); |
654
|
|
|
$this->DrawText($this->small_font, 90, |
655
|
|
|
$xpos, $ypos, $this->ndx_label_color, $this->y_label_ttffont_size, $this->y_label_txt); |
|
|
|
|
656
|
|
|
} |
657
|
|
|
return true; |
658
|
|
|
} |
659
|
|
|
|
660
|
|
|
function DrawText($which_font,$which_angle,$which_xpos,$which_ypos,$which_color,$which_size,$which_text,$which_halign='left',$which_valign='') { |
661
|
|
|
|
662
|
|
|
if ($this->use_ttf == 1 ) { |
663
|
|
|
$size = $this->TTFBBoxSize($which_size, $which_angle, $which_font, $which_text); |
664
|
|
|
if ($which_valign == 'bottom') { |
665
|
|
|
$which_ypos = $which_ypos + ImageFontHeight($which_font); |
666
|
|
|
} |
667
|
|
|
if ($which_halign == 'center') { |
668
|
|
|
$which_xpos = $which_xpos - $size[0]/2; |
669
|
|
|
} |
670
|
|
|
ImageTTFText($this->img, $which_size, $which_angle, |
671
|
|
|
$which_xpos, $which_ypos, $which_color, $which_font, $which_text); |
672
|
|
|
} else { |
673
|
|
|
if ($which_valign == 'top') { |
674
|
|
|
$which_ypos = $which_ypos - ImageFontHeight((int)$which_font); |
675
|
|
|
} |
676
|
|
|
$which_text = preg_replace("/\r/","",$which_text); |
677
|
|
|
$str = explode("\n",$which_text); //multiple lines submitted by Remi Ricard |
678
|
|
|
$height = ImageFontHeight((int)$which_font); |
679
|
|
|
$width = ImageFontWidth((int)$which_font); |
680
|
|
|
if ($which_angle == 90) { //Vertical Code Submitted by Marlin Viss |
681
|
|
|
for($i=0;$i<count($str);$i++) { |
|
|
|
|
682
|
|
|
ImageStringUp($this->img, $which_font, ($i*$height + $which_xpos), $which_ypos, $str[$i], $which_color); |
683
|
|
|
} |
684
|
|
|
} else { |
685
|
|
|
for($i=0;$i<count($str);$i++) { |
|
|
|
|
686
|
|
|
if ($which_halign == 'center') { |
687
|
|
|
$xpos = $which_xpos - strlen($str[$i]) * $width/2; |
688
|
|
|
ImageString($this->img, (int)$which_font, $xpos, ($i*$height + $which_ypos), $str[$i], $which_color); |
689
|
|
|
} else { |
690
|
|
|
ImageString($this->img, (int)$which_font, $which_xpos, ($i*$height + $which_ypos), $str[$i], $which_color); |
691
|
|
|
} |
692
|
|
|
} |
693
|
|
|
} |
694
|
|
|
|
695
|
|
|
} |
696
|
|
|
return true; |
697
|
|
|
|
698
|
|
|
} |
699
|
|
|
function DrawTitle() { |
700
|
|
|
if ($this->use_ttf == 1 ) { |
701
|
|
|
$xpos = ($this->plot_area[0] + $this->plot_area_width / 2); |
702
|
|
|
$ypos = $this->y_top_margin/2; |
703
|
|
|
$this->DrawText($this->title_ttffont, $this->title_angle, |
704
|
|
|
$xpos, $ypos, $this->ndx_title_color, $this->title_ttffont_size, $this->title_txt,'center'); |
|
|
|
|
705
|
|
|
} else { |
706
|
|
|
$xpos = ($this->plot_area[0] + $this->plot_area_width / 2); |
707
|
|
|
$ypos = ImageFontHeight($this->title_font); |
708
|
|
|
$this->DrawText($this->title_font, $this->title_angle, |
709
|
|
|
$xpos, $ypos, $this->ndx_title_color, '', $this->title_txt,'center'); |
|
|
|
|
710
|
|
|
} |
711
|
|
|
return true; |
712
|
|
|
|
713
|
|
|
} |
714
|
|
|
|
715
|
|
|
function DrawPlotAreaBackground() { |
716
|
|
|
ImageFilledRectangle($this->img,$this->plot_area[0], |
717
|
|
|
$this->plot_area[1],$this->plot_area[2],$this->plot_area[3], |
718
|
|
|
$this->ndx_plot_bg_color); |
|
|
|
|
719
|
|
|
} |
720
|
|
|
|
721
|
|
|
function SetBackgroundColor($which_color) { |
722
|
|
|
$this->bg_color= $which_color; |
723
|
|
|
$this->ndx_bg_color= $this->SetIndexColor($which_color); |
|
|
|
|
724
|
|
|
return true; |
725
|
|
|
} |
726
|
|
|
function SetPlotBgColor($which_color) { |
727
|
|
|
$this->plot_bg_color= $which_color; |
728
|
|
|
$this->ndx_plot_bg_color= $this->SetIndexColor($which_color); |
|
|
|
|
729
|
|
|
return true; |
730
|
|
|
} |
731
|
|
|
|
732
|
|
|
function SetShading($which_s) { |
733
|
|
|
$this->shading = $which_s; |
734
|
|
|
return true; |
735
|
|
|
} |
736
|
|
|
|
737
|
|
|
function SetTitleColor($which_color) { |
738
|
|
|
$this->title_color= $which_color; |
739
|
|
|
$this->ndx_title_color= $this->SetIndexColor($which_color); |
|
|
|
|
740
|
|
|
return true; |
741
|
|
|
} |
742
|
|
|
|
743
|
|
|
function SetTickColor ($which_color) { |
744
|
|
|
$this->tick_color= $which_color; |
745
|
|
|
$this->ndx_tick_color= $this->SetIndexColor($which_color); |
|
|
|
|
746
|
|
|
return true; |
747
|
|
|
} |
748
|
|
|
|
749
|
|
|
function SetLabelColor ($which_color) { |
750
|
|
|
$this->label_color= $which_color; |
751
|
|
|
$this->ndx_label_color= $this->SetIndexColor($which_color); |
|
|
|
|
752
|
|
|
return true; |
753
|
|
|
} |
754
|
|
|
|
755
|
|
|
function SetTextColor ($which_color) { |
756
|
|
|
$this->text_color= $which_color; |
757
|
|
|
$this->ndx_text_color= $this->SetIndexColor($which_color); |
|
|
|
|
758
|
|
|
return true; |
759
|
|
|
} |
760
|
|
|
|
761
|
|
|
function SetLightGridColor ($which_color) { |
762
|
|
|
$this->light_grid_color= $which_color; |
763
|
|
|
$this->ndx_light_grid_color= $this->SetIndexColor($which_color); |
|
|
|
|
764
|
|
|
return true; |
765
|
|
|
} |
766
|
|
|
|
767
|
|
|
function SetGridColor ($which_color) { |
768
|
|
|
$this->grid_color = $which_color; |
769
|
|
|
$this->ndx_grid_color= $this->SetIndexColor($which_color); |
|
|
|
|
770
|
|
|
return true; |
771
|
|
|
} |
772
|
|
|
|
773
|
|
|
function SetCharacterHeight() { |
774
|
|
|
//to be set |
775
|
|
|
return true; |
776
|
|
|
} |
777
|
|
|
|
778
|
|
|
function SetPlotType($which_pt) { |
779
|
|
|
$accepted = "bars,lines,linepoints,area,points,pie,thinbarline"; |
780
|
|
|
$asked = trim($which_pt); |
781
|
|
|
if (preg_match('/' . $asked .'/i', $accepted)) { |
782
|
|
|
$this->plot_type = $which_pt; |
783
|
|
|
return true; |
784
|
|
|
} else { |
785
|
|
|
$this->DrawError('$which_pt not an acceptable plot type'); |
786
|
|
|
return false; |
787
|
|
|
} |
788
|
|
|
} |
789
|
|
|
|
790
|
|
|
function FindDataLimits() { |
791
|
|
|
//Text-Data is different than data-data graphs. For them what |
792
|
|
|
// we have, instead of X values, is # of records equally spaced on data. |
793
|
|
|
//text-data is passed in as $data[] = (title,y1,y2,y3,y4,...) |
794
|
|
|
//data-data is passed in as $data[] = (title,x,y1,y2,y3,y4,...) |
795
|
|
|
|
796
|
|
|
$this->number_x_points = count($this->data_values); |
797
|
|
|
|
798
|
|
|
switch ($this->data_type) { |
799
|
|
|
case "text-data": |
800
|
|
|
$minx = 0; //valid for BAR TYPE GRAPHS ONLY |
801
|
|
|
$maxx = $this->number_x_points - 1 ; //valid for BAR TYPE GRAPHS ONLY |
802
|
|
|
$miny = (double) $this->data_values[0][1]; |
803
|
|
|
$maxy = $miny; |
804
|
|
|
if ($this->draw_x_data_labels == "") { |
805
|
|
|
$this->draw_x_data_labels = 1; //labels_note1: prevent both data labels and x-axis labels being both drawn and overlapping |
|
|
|
|
806
|
|
|
} |
807
|
|
|
break; |
808
|
|
|
default: //Everything else: data-data, etc. |
809
|
|
|
$maxx = $this->data_values[0][1]; |
810
|
|
|
$minx = $maxx; |
811
|
|
|
$miny = $this->data_values[0][2]; |
812
|
|
|
$maxy = $miny; |
|
|
|
|
813
|
|
|
$maxy = $miny; |
814
|
|
|
break; |
815
|
|
|
} |
816
|
|
|
|
817
|
|
|
$max_records_per_group = 0; |
818
|
|
|
$total_records = 0; |
819
|
|
|
$mine = 0; //Maximum value for the -error bar (assume error bars always > 0) |
820
|
|
|
$maxe = 0; //Maximum value for the +error bar (assume error bars always > 0) |
821
|
|
|
|
822
|
|
|
foreach ($this->data_values as $dat_key => $dat) { |
823
|
|
|
$tmp = 0; |
824
|
|
|
$total_records += count($dat) - 1; // -1 for label |
825
|
|
|
|
826
|
|
|
switch ($this->data_type) { |
827
|
|
|
case "text-data": |
828
|
|
|
//Find the relative Max and Min |
829
|
|
|
|
830
|
|
|
foreach ($dat as $key => $val) { |
831
|
|
|
if ($key != 0) { //$dat[0] = label |
832
|
|
|
SetType($val,"double"); |
833
|
|
|
if ($val > $maxy) { |
834
|
|
|
$maxy = $val ; |
835
|
|
|
} |
836
|
|
|
if ($val < $miny) { |
837
|
|
|
$miny = (double) $val ; |
838
|
|
|
} |
839
|
|
|
} |
840
|
|
|
$tmp++; |
841
|
|
|
} |
842
|
|
|
break; |
843
|
|
|
case "data-data": //X-Y data is passed in as $data[] = (title,x,y,y2,y3,...) which you can use for multi-dimentional plots. |
844
|
|
|
|
845
|
|
|
foreach ($dat as $key => $val) { |
846
|
|
|
if ($key == 1) { //$dat[0] = label |
847
|
|
|
SetType($val,"double"); |
848
|
|
|
if ($val > $maxx) { |
849
|
|
|
$maxx = $val; |
850
|
|
|
} elseif ($val < $minx) { |
851
|
|
|
$minx = $val; |
852
|
|
|
} |
853
|
|
View Code Duplication |
} elseif ($key > 1) { |
|
|
|
|
854
|
|
|
SetType($val,"double"); |
855
|
|
|
if ($val > $maxy) { |
856
|
|
|
$maxy = $val ; |
857
|
|
|
} elseif ($val < $miny) { |
858
|
|
|
$miny = $val ; |
859
|
|
|
} |
860
|
|
|
} |
861
|
|
|
$tmp++; |
862
|
|
|
} |
863
|
|
|
$tmp = $tmp - 1; //# records per group |
864
|
|
|
break; |
865
|
|
|
case "data-data-error": //Assume 2-D for now, can go higher |
866
|
|
|
//Regular X-Y data is passed in as $data[] = (title,x,y,error+,error-,y2,error2+,error2-) |
867
|
|
|
|
868
|
|
|
foreach ($dat as $key => $val) { |
869
|
|
|
if ($key == 1) { //$dat[0] = label |
870
|
|
|
SetType($val,'double'); |
871
|
|
|
if ($val > $maxx) { |
872
|
|
|
$maxx = $val; |
873
|
|
|
} elseif ($val < $minx) { |
874
|
|
|
$minx = $val; |
875
|
|
|
} |
876
|
|
View Code Duplication |
} elseif ($key%3 == 2) { |
|
|
|
|
877
|
|
|
SetType($val,'double'); |
878
|
|
|
if ($val > $maxy) { |
879
|
|
|
$maxy = $val ; |
880
|
|
|
} elseif ($val < $miny) { |
881
|
|
|
$miny = $val ; |
882
|
|
|
} |
883
|
|
|
} elseif ($key%3 == 0) { |
884
|
|
|
SetType($val,'double'); |
885
|
|
|
if ($val > $maxe) { |
886
|
|
|
$maxe = $val ; |
887
|
|
|
} |
888
|
|
|
} elseif ($key%3 == 1) { |
889
|
|
|
SetType($val,'double'); |
890
|
|
|
if ($val > $mine) { |
891
|
|
|
$mine = $val ; |
892
|
|
|
} |
893
|
|
|
} |
894
|
|
|
$tmp++; |
895
|
|
|
} |
896
|
|
|
$maxy = $maxy + $maxe; |
897
|
|
|
$miny = $miny - $mine; //assume error bars are always > 0 |
898
|
|
|
|
899
|
|
|
break; |
900
|
|
|
default: |
901
|
|
|
$this->PrintError('ERROR: unknown chart type'); |
902
|
|
|
break; |
903
|
|
|
} |
904
|
|
|
if ($tmp > $max_records_per_group) { |
905
|
|
|
$max_records_per_group = $tmp; |
906
|
|
|
} |
907
|
|
|
} |
908
|
|
|
|
909
|
|
|
|
910
|
|
|
$this->min_x = $minx; |
|
|
|
|
911
|
|
|
$this->max_x = $maxx; |
912
|
|
|
$this->min_y = $miny; |
913
|
|
|
$this->max_y = $maxy; |
914
|
|
|
|
915
|
|
|
|
916
|
|
|
if ($max_records_per_group > 1) { |
917
|
|
|
$this->records_per_group = $max_records_per_group - 1; |
|
|
|
|
918
|
|
|
} else { |
919
|
|
|
$this->records_per_group = 1; |
920
|
|
|
} |
921
|
|
|
|
922
|
|
|
|
923
|
|
|
//$this->data_count = $total_records ; |
924
|
|
|
} // function FindDataLimits |
925
|
|
|
|
926
|
|
|
function SetMargins() { |
927
|
|
|
///////////////////////////////////////////////////////////////// |
928
|
|
|
// When the image is first created - set the margins |
929
|
|
|
// to be the standard viewport. |
930
|
|
|
// The standard viewport is the full area of the view surface (or panel), |
931
|
|
|
// less a margin of 4 character heights all round for labelling. |
932
|
|
|
// It thus depends on the current character size, set by SetCharacterHeight(). |
933
|
|
|
///////////////////////////////////////////////////////////////// |
934
|
|
|
|
935
|
|
|
$str = explode("\n",$this->title_txt); |
936
|
|
|
$nbLines = count($str); |
937
|
|
|
|
938
|
|
|
if ($this->use_ttf == 1) { |
939
|
|
|
$title_size = $this->TTFBBoxSize($this->title_ttffont_size, $this->title_angle, $this->title_ttffont, 'X'); //An array |
940
|
|
View Code Duplication |
if ($nbLines == 1) { |
|
|
|
|
941
|
|
|
$this->y_top_margin = $title_size[1] * 4; |
942
|
|
|
} else { |
943
|
|
|
$this->y_top_margin = $title_size[1] * ($nbLines+3); |
944
|
|
|
} |
945
|
|
|
|
946
|
|
|
//ajo working here |
947
|
|
|
//$x_label_size = $this->TTFBBoxSize($this->x_label_ttffont_size, 0, $this->axis_ttffont, $this->x_label_txt); |
948
|
|
|
|
949
|
|
|
$this->y_bot_margin = $this->x_label_height ; |
950
|
|
|
$this->x_left_margin = $this->y_label_width * 2 + $this->tick_length; |
951
|
|
|
$this->x_right_margin = 33.0; // distance between right and end of x axis in pixels |
952
|
|
|
} else { |
953
|
|
|
$title_size = array(ImageFontWidth($this->title_font) * strlen($this->title_txt),ImageFontHeight($this->title_font)); |
954
|
|
|
//$this->y_top_margin = ($title_size[1] * 4); |
955
|
|
View Code Duplication |
if ($nbLines == 1) { |
|
|
|
|
956
|
|
|
$this->y_top_margin = $title_size[1] * 4; |
957
|
|
|
} else { |
958
|
|
|
$this->y_top_margin = $title_size[1] * ($nbLines+3); |
959
|
|
|
} |
960
|
|
|
if ($this->x_datalabel_angle == 90) { |
961
|
|
|
$this->y_bot_margin = 76.0; // Must be integer |
962
|
|
|
} else { |
963
|
|
|
$this->y_bot_margin = 66.0; // Must be integer |
964
|
|
|
} |
965
|
|
|
$this->x_left_margin = 77.0; // distance between left and start of x axis in pixels |
966
|
|
|
$this->x_right_margin = 33.0; // distance between right and end of x axis in pixels |
967
|
|
|
} |
968
|
|
|
|
969
|
|
|
//exit; |
970
|
|
|
$this->x_tot_margin = $this->x_left_margin + $this->x_right_margin; |
|
|
|
|
971
|
|
|
$this->y_tot_margin = $this->y_top_margin + $this->y_bot_margin; |
|
|
|
|
972
|
|
|
|
973
|
|
|
if ($this->plot_max_x && $this->plot_max_y && $this->plot_area_width ) { //If data has already been analysed then set translation |
974
|
|
|
$this->SetTranslation(); |
975
|
|
|
} |
976
|
|
|
} |
977
|
|
|
|
978
|
|
|
function SetMarginsPixels($which_lm,$which_rm,$which_tm,$which_bm) { |
979
|
|
|
//Set the plot area using margins in pixels (left, right, top, bottom) |
980
|
|
|
$this->SetNewPlotAreaPixels($which_lm,$which_tm,($this->image_width - $which_rm),($this->image_height - $which_bm)); |
981
|
|
|
return true; |
982
|
|
|
} |
983
|
|
|
|
984
|
|
|
function SetNewPlotAreaPixels($x1,$y1,$x2,$y2) { |
985
|
|
|
//Like in GD 0,0 is upper left set via pixel Coordinates |
986
|
|
|
$this->plot_area = array($x1,$y1,$x2,$y2); |
987
|
|
|
$this->plot_area_width = $this->plot_area[2] - $this->plot_area[0]; |
|
|
|
|
988
|
|
|
$this->plot_area_height = $this->plot_area[3] - $this->plot_area[1]; |
|
|
|
|
989
|
|
|
$this->y_top_margin = $this->plot_area[1]; |
990
|
|
|
if ($this->plot_max_x) { |
991
|
|
|
$this->SetTranslation(); |
992
|
|
|
} |
993
|
|
|
return true; |
994
|
|
|
} |
995
|
|
|
|
996
|
|
|
function SetPlotAreaPixels($x1,$y1,$x2,$y2) { |
997
|
|
|
//Like in GD 0,0 is upper left |
998
|
|
|
if (!$this->x_tot_margin) { |
999
|
|
|
$this->SetMargins(); |
1000
|
|
|
} |
1001
|
|
|
if ($x2 && $y2) { |
1002
|
|
|
$this->plot_area = array($x1,$y1,$x2,$y2); |
1003
|
|
|
} else { |
1004
|
|
|
$this->plot_area = array($this->x_left_margin, $this->y_top_margin, |
1005
|
|
|
$this->image_width - $this->x_right_margin, |
1006
|
|
|
$this->image_height - $this->y_bot_margin |
1007
|
|
|
); |
1008
|
|
|
} |
1009
|
|
|
$this->plot_area_width = $this->plot_area[2] - $this->plot_area[0]; |
|
|
|
|
1010
|
|
|
$this->plot_area_height = $this->plot_area[3] - $this->plot_area[1]; |
|
|
|
|
1011
|
|
|
|
1012
|
|
|
return true; |
1013
|
|
|
|
1014
|
|
|
} |
1015
|
|
|
|
1016
|
|
|
function SetPlotAreaWorld($xmin,$ymin,$xmax,$ymax) { |
1017
|
|
|
if (($xmin == "") && ($xmax == "")) { |
1018
|
|
|
//For automatic setting of data we need $this->max_x |
1019
|
|
|
if (!$this->max_y) { |
1020
|
|
|
$this->FindDataLimits() ; |
1021
|
|
|
} |
1022
|
|
|
if ($this->data_type == 'text-data') { //labels for text-data is done at data drawing time for speed. |
1023
|
|
|
$xmax = $this->max_x + 1 ; //valid for BAR CHART TYPE GRAPHS ONLY |
1024
|
|
|
$xmin = 0 ; //valid for BAR CHART TYPE GRAPHS ONLY |
1025
|
|
|
} else { |
1026
|
|
|
$xmax = $this->max_x * 1.02; |
1027
|
|
|
$xmin = $this->min_x; |
1028
|
|
|
} |
1029
|
|
|
|
1030
|
|
|
$ymax = ceil($this->max_y * 1.2); |
1031
|
|
|
if ($this->min_y < 0) { |
1032
|
|
|
$ymin = floor($this->min_y * 1.2); |
1033
|
|
|
} else { |
1034
|
|
|
$ymin = 0; |
1035
|
|
|
} |
1036
|
|
|
} |
1037
|
|
|
|
1038
|
|
|
$this->plot_min_x = $xmin; |
1039
|
|
|
$this->plot_max_x = $xmax; |
1040
|
|
|
|
1041
|
|
|
if ($ymin == $ymax) { |
1042
|
|
|
$ymax += 1; |
1043
|
|
|
} |
1044
|
|
|
if ($this->yscale_type == "log") { |
1045
|
|
|
//extra error checking |
1046
|
|
|
if ($ymin <= 0) { |
1047
|
|
|
$ymin = 1; |
1048
|
|
|
} |
1049
|
|
|
if ($ymax <= 0) { |
1050
|
|
|
$this->PrintError('Log plots need data greater than 0'); |
1051
|
|
|
} |
1052
|
|
|
} |
1053
|
|
|
$this->plot_min_y = $ymin; |
1054
|
|
|
$this->plot_max_y = $ymax; |
1055
|
|
|
|
1056
|
|
|
if ($ymax <= $ymin) { |
1057
|
|
|
$this->DrawError('Error in Data - max not gt min'); |
1058
|
|
|
} |
1059
|
|
|
|
1060
|
|
|
//Set the boundaries of the box for plotting in world coord |
1061
|
|
|
// if (!$this->x_tot_margin) { //We need to know the margins before we can calculate scale |
1062
|
|
|
// $this->SetMargins(); |
1063
|
|
|
// } |
1064
|
|
|
//For this we have to reset the scale |
1065
|
|
|
if ($this->plot_area_width) { |
1066
|
|
|
$this->SetTranslation(); |
1067
|
|
|
} |
1068
|
|
|
|
1069
|
|
|
return true; |
1070
|
|
|
|
1071
|
|
|
} //function SetPlotAreaWorld |
1072
|
|
|
|
1073
|
|
|
|
1074
|
|
|
function PrintError($error_message) { |
1075
|
|
|
// prints the error message to stdout and die |
1076
|
|
|
echo "<p><strong>Fatal error</strong>: $error_message<p>"; |
1077
|
|
|
die; |
1078
|
|
|
} |
1079
|
|
|
|
1080
|
|
|
function DrawError($error_message) { |
1081
|
|
|
// prints the error message inline into |
1082
|
|
|
// the generated image |
1083
|
|
|
|
1084
|
|
|
if (($this->img) == "") { $this->InitImage(); } ; |
1085
|
|
|
|
1086
|
|
|
$ypos = $this->image_height/2; |
1087
|
|
|
|
1088
|
|
|
if ($this->use_ttf == 1) { |
1089
|
|
|
ImageRectangle($this->img, 0,0,$this->image_width,$this->image_height,ImageColorAllocate($this->img,255,255,255)); |
1090
|
|
|
ImageTTFText($this->img, $this->small_ttffont_size, 0, $xpos, $ypos, ImageColorAllocate($this->img,0,0,0), $this->axis_ttffont, $error_message); |
|
|
|
|
1091
|
|
|
} else { |
1092
|
|
|
ImageRectangle($this->img, 0,0,$this->image_width,$this->image_height,ImageColorAllocate($this->img,255,255,255)); |
1093
|
|
|
ImageString($this->img, $this->small_font,1,$ypos,$error_message, ImageColorAllocate($this->img,0,0,0)); |
1094
|
|
|
} |
1095
|
|
|
|
1096
|
|
|
$this->PrintImage(); |
1097
|
|
|
return true; |
1098
|
|
|
} |
1099
|
|
|
|
1100
|
|
|
function TTFBBoxSize($size, $angle, $font, $string) { |
1101
|
|
|
|
1102
|
|
|
//Assume angle < 90 |
1103
|
|
|
$arr = ImageTTFBBox($size, 0, $font, $string); |
1104
|
|
|
$flat_width = $arr[0] - $arr[2]; |
1105
|
|
|
$flat_height = abs($arr[3] - $arr[5]); |
1106
|
|
|
|
1107
|
|
|
// for 90deg: |
1108
|
|
|
// $height = $arr[5] - $arr[7]; |
1109
|
|
|
// $width = $arr[2] - $arr[4]; |
1110
|
|
|
|
1111
|
|
|
$angle = deg2rad($angle); |
1112
|
|
|
$width = ceil(abs($flat_width*cos($angle) + $flat_height*sin($angle))); //Must be integer |
1113
|
|
|
$height = ceil(abs($flat_width*sin($angle) + $flat_height*cos($angle))); //Must be integer |
1114
|
|
|
|
1115
|
|
|
return array($width, $height); |
1116
|
|
|
} |
1117
|
|
|
|
1118
|
|
|
function SetXLabelHeight() { |
1119
|
|
|
|
1120
|
|
|
if ($this->use_ttf == 1) { |
1121
|
|
|
//Space for the X Label |
1122
|
|
|
$size = $this->TTFBBoxSize($this->x_label_ttffont_size, 0, $this->axis_ttffont, $this->x_label_txt); |
1123
|
|
|
$tmp = $size[1]; |
1124
|
|
|
|
1125
|
|
|
//$string = Str_Repeat('w', $this->x_datalabel_maxlength); |
1126
|
|
|
$i = 0; |
1127
|
|
|
$string = ''; |
1128
|
|
|
while ($i < $this->x_datalabel_maxlength) { |
1129
|
|
|
$string .= 'w'; |
1130
|
|
|
$i++; |
1131
|
|
|
} |
1132
|
|
|
|
1133
|
|
|
//Space for the axis data labels |
1134
|
|
|
$size = $this->TTFBBoxSize($this->axis_ttffont_size, $this->x_datalabel_angle, $this->axis_ttffont, $string); |
1135
|
|
|
|
1136
|
|
|
$this->x_label_height = 2*$tmp + $size[1] + 4; |
1137
|
|
|
|
1138
|
|
|
} else { |
1139
|
|
|
//For Non-TTF fonts we can have only angles 0 or 90 |
1140
|
|
|
if ($this->x_datalabel_angle == 90) { |
1141
|
|
|
$this->x_label_height = $this->x_datalabel_maxlength * ImageFontWidth($this->small_font) / 1.5; |
1142
|
|
|
} else { |
1143
|
|
|
$this->x_label_height = 5 * ImageFontHeight($this->small_font); |
1144
|
|
|
} |
1145
|
|
|
} |
1146
|
|
|
|
1147
|
|
|
$this->SetMargins(); |
1148
|
|
|
|
1149
|
|
|
return true; |
1150
|
|
|
} //function SetXLabelHeight |
1151
|
|
|
|
1152
|
|
|
function SetYLabelWidth() { |
1153
|
|
|
//$ylab = sprintf("%6.1f %s",$i,$si_units[0]); //use for PHP2 compatibility |
1154
|
|
|
//the "." is for space. It isn't actually printed |
1155
|
|
|
$ylab = number_format($this->max_y, $this->y_precision, ".", ",") . $this->si_units . "."; |
1156
|
|
|
|
1157
|
|
|
if ($this->use_ttf == 1) { |
1158
|
|
|
$size = $this->TTFBBoxSize($this->axis_ttffont_size, 0, $this->axis_ttffont, $ylab); |
1159
|
|
|
} else { |
1160
|
|
|
$size[0] = StrLen($ylab) * $this->small_font_width * .6; |
|
|
|
|
1161
|
|
|
} |
1162
|
|
|
|
1163
|
|
|
$this->y_label_width = $size[0] * 2; |
|
|
|
|
1164
|
|
|
//echo "SYLW: $this->y_label_width<br />"; |
1165
|
|
|
//exit; |
1166
|
|
|
|
1167
|
|
|
$this->SetMargins(); |
1168
|
|
|
return true; |
1169
|
|
|
} |
1170
|
|
|
|
1171
|
|
|
function SetEqualXCoord() { |
1172
|
|
|
//for plots that have equally spaced x variables and multiple bars per x-point. |
1173
|
|
|
|
1174
|
|
|
$space = ($this->plot_area[2] - $this->plot_area[0]) / ($this->number_x_points * 2) * $this->group_frac_width; |
1175
|
|
|
$group_width = $space * 2; |
1176
|
|
|
$bar_width = $group_width / $this->records_per_group; |
1177
|
|
|
//I think that eventually this space variable will be replaced by just graphing x. |
1178
|
|
|
$this->data_group_space = $space; |
|
|
|
|
1179
|
|
|
$this->record_bar_width = $bar_width; |
|
|
|
|
1180
|
|
|
return true; |
1181
|
|
|
} |
1182
|
|
|
|
1183
|
|
|
function SetLabelScalePosition($which_blp) { |
1184
|
|
|
//0 to 1 |
1185
|
|
|
$this->label_scale_position = $which_blp; |
1186
|
|
|
return true; |
1187
|
|
|
} |
1188
|
|
|
|
1189
|
|
|
function SetErrorBarSize($which_ebs) { |
1190
|
|
|
//in pixels |
1191
|
|
|
$this->error_bar_size = $which_ebs; |
1192
|
|
|
return true; |
1193
|
|
|
} |
1194
|
|
|
|
1195
|
|
|
function SetErrorBarShape($which_ebs) { |
1196
|
|
|
//in pixels |
1197
|
|
|
$this->error_bar_shape = $which_ebs; |
1198
|
|
|
return true; |
1199
|
|
|
} |
1200
|
|
|
|
1201
|
|
|
function SetPointShape($which_pt) { |
1202
|
|
|
//in pixels |
1203
|
|
|
$this->point_shape = $which_pt; |
1204
|
|
|
return true; |
1205
|
|
|
} |
1206
|
|
|
|
1207
|
|
|
function SetPointSize($which_ps) { |
1208
|
|
|
//in pixels |
1209
|
|
|
SetType($which_ps,'integer'); |
1210
|
|
|
$this->point_size = $which_ps; |
1211
|
|
|
|
1212
|
|
|
if ($this->point_shape == "diamond" or $this->point_shape == "triangle") { |
1213
|
|
|
if ($this->point_size % 2 != 0) { |
1214
|
|
|
$this->point_size++; |
1215
|
|
|
} |
1216
|
|
|
} |
1217
|
|
|
return true; |
1218
|
|
|
} |
1219
|
|
|
|
1220
|
|
|
function SetDataType($which_dt) { |
1221
|
|
|
//The next three lines are for past compatibility. |
1222
|
|
|
if ($which_dt == "text-linear") { $which_dt = "text-data"; }; |
1223
|
|
|
if ($which_dt == "linear-linear") { $which_dt = "data-data"; }; |
1224
|
|
|
if ($which_dt == "linear-linear-error") { $which_dt = "data-data-error"; }; |
1225
|
|
|
|
1226
|
|
|
$this->data_type = $which_dt; //text-data, data-data, data-data-error |
1227
|
|
|
return true; |
1228
|
|
|
} |
1229
|
|
|
|
1230
|
|
|
function SetDataValues($which_dv) { |
1231
|
|
|
$this->data_values = $which_dv; |
1232
|
|
|
//echo $this->data_values |
1233
|
|
|
return true; |
1234
|
|
|
} |
1235
|
|
|
|
1236
|
|
|
//////////////COLORS |
1237
|
|
|
function SetRGBArray ($which_color_array) { |
1238
|
|
|
if ( is_array($which_color_array) ) { |
1239
|
|
|
//User Defined Array |
1240
|
|
|
$this->rgb_array = $which_color_array; |
|
|
|
|
1241
|
|
|
return true; |
1242
|
|
|
} elseif ($which_color_array == 2) { //Use the small predefined color array |
1243
|
|
|
$this->rgb_array = array( |
1244
|
|
|
"white" => array(255, 255, 255), |
1245
|
|
|
"snow" => array(255, 250, 250), |
1246
|
|
|
"PeachPuff" => array(255, 218, 185), |
1247
|
|
|
"ivory" => array(255, 255, 240), |
1248
|
|
|
"lavender" => array(230, 230, 250), |
1249
|
|
|
"black" => array( 0, 0, 0), |
1250
|
|
|
"DimGrey" => array(105, 105, 105), |
1251
|
|
|
"gray" => array(190, 190, 190), |
1252
|
|
|
"grey" => array(190, 190, 190), |
1253
|
|
|
"navy" => array( 0, 0, 128), |
1254
|
|
|
"SlateBlue" => array(106, 90, 205), |
1255
|
|
|
"blue" => array( 0, 0, 255), |
1256
|
|
|
"SkyBlue" => array(135, 206, 235), |
1257
|
|
|
"cyan" => array( 0, 255, 255), |
1258
|
|
|
"DarkGreen" => array( 0, 100, 0), |
1259
|
|
|
"green" => array( 0, 255, 0), |
1260
|
|
|
"YellowGreen" => array(154, 205, 50), |
1261
|
|
|
"yellow" => array(255, 255, 0), |
1262
|
|
|
"orange" => array(255, 165, 0), |
1263
|
|
|
"gold" => array(255, 215, 0), |
1264
|
|
|
"peru" => array(205, 133, 63), |
1265
|
|
|
"beige" => array(245, 245, 220), |
1266
|
|
|
"wheat" => array(245, 222, 179), |
1267
|
|
|
"tan" => array(210, 180, 140), |
1268
|
|
|
"brown" => array(165, 42, 42), |
1269
|
|
|
"salmon" => array(250, 128, 114), |
1270
|
|
|
"red" => array(255, 0, 0), |
1271
|
|
|
"pink" => array(255, 192, 203), |
1272
|
|
|
"maroon" => array(176, 48, 96), |
1273
|
|
|
"magenta" => array(255, 0, 255), |
1274
|
|
|
"violet" => array(238, 130, 238), |
1275
|
|
|
"plum" => array(221, 160, 221), |
1276
|
|
|
"orchid" => array(218, 112, 214), |
1277
|
|
|
"purple" => array(160, 32, 240), |
1278
|
|
|
"azure1" => array(240, 255, 255), |
1279
|
|
|
"aquamarine1" => array(127, 255, 212) |
1280
|
|
|
); |
1281
|
|
|
return true; |
1282
|
|
|
} elseif ($which_color_array == 1) { |
1283
|
|
|
include("./rgb.inc.php"); //Get large $ColorArray |
1284
|
|
|
$this->rgb_array = $RGBArray; |
|
|
|
|
1285
|
|
|
} else { |
1286
|
|
|
$this->rgb_array = array("white" =>array(255,255,255), "black" => array(0,0,0)); |
1287
|
|
|
exit; |
1288
|
|
|
} |
1289
|
|
|
|
1290
|
|
|
return true; |
1291
|
|
|
} |
1292
|
|
|
|
1293
|
|
|
function SetColor($which_color) { |
1294
|
|
|
//obsoleted by SetRGBColor |
1295
|
|
|
SetRgbColor($which_color); |
1296
|
|
|
return true; |
1297
|
|
|
} |
1298
|
|
|
|
1299
|
|
|
function SetIndexColor($which_color) { //Color is passed in as anything |
1300
|
|
|
list ($r, $g, $b) = $this->SetRgbColor($which_color); //Translate to RGB |
1301
|
|
|
$index = ImageColorExact($this->img, $r, $g, $b); |
1302
|
|
|
if ($index == -1) { |
1303
|
|
|
//return ImageColorAllocate($this->img, $r, $g, $b); |
1304
|
|
|
//return ImageColorClosest($this->img, $r, $g, $b); |
1305
|
|
|
return ImageColorResolve($this->img, $r, $g, $b); //requires PHP 3.0.2 and later |
1306
|
|
|
} else { |
1307
|
|
|
return $index; |
1308
|
|
|
} |
1309
|
|
|
} |
1310
|
|
|
|
1311
|
|
|
function SetTransparentColor($which_color) { |
1312
|
|
|
ImageColorTransparent($this->img,$this->SetIndexColor($which_color)); |
1313
|
|
|
return true; |
1314
|
|
|
} |
1315
|
|
|
|
1316
|
|
|
function SetRgbColor($color_asked) { |
1317
|
|
|
//Returns an array in R,G,B format 0-255 |
1318
|
|
|
if ($color_asked == "") { $color_asked = array(0,0,0); }; |
1319
|
|
|
|
1320
|
|
|
if ( count($color_asked) == 3 ) { //already array of 3 rgb |
1321
|
|
|
$ret_val = $color_asked; |
1322
|
|
|
} else { // is asking for a color by string |
1323
|
|
|
if(substr($color_asked,0,1) == "#") { //asking in #FFFFFF format. |
1324
|
|
|
$ret_val = array(hexdec(substr($color_asked,1,2)), hexdec(substr($color_asked,3,2)), hexdec(substr($color,5,2))); |
|
|
|
|
1325
|
|
|
} else { |
1326
|
|
|
$ret_val = $this->rgb_array[$color_asked]; |
1327
|
|
|
} |
1328
|
|
|
} |
1329
|
|
|
return $ret_val; |
1330
|
|
|
} |
1331
|
|
|
|
1332
|
|
|
function SetDataColors($which_data,$which_border) { |
1333
|
|
|
//Set the data to be displayed in a particular color |
1334
|
|
|
if (!$which_data) { |
1335
|
|
|
$which_data = array(array(0,255,0),array(0,0,248),'yellow',array(255,0,0),'orange'); |
1336
|
|
|
$which_border = array('black'); |
1337
|
|
|
} |
1338
|
|
|
|
1339
|
|
|
$this->data_color = $which_data; //an array |
1340
|
|
|
$this->data_border_color = $which_border; //an array |
1341
|
|
|
|
1342
|
|
|
unset($this->ndx_data_color); |
1343
|
|
|
$i = 0; |
1344
|
|
|
foreach ($this->data_color as $col) { |
1345
|
|
|
$this->ndx_data_color[$i] = $this->SetIndexColor($col); |
|
|
|
|
1346
|
|
|
$i++; |
1347
|
|
|
} |
1348
|
|
|
|
1349
|
|
|
// border_color |
1350
|
|
|
//If we are also going to put a border on the data (bars, dots, area, ...) |
1351
|
|
|
// then lets also set a border color as well. |
1352
|
|
|
unset($this->ndx_data_border_color); |
1353
|
|
|
$i = 0; |
1354
|
|
|
foreach ($this->data_border_color as $col) { |
1355
|
|
|
$this->ndx_data_border_color[$i] = $this->SetIndexColor($col); |
|
|
|
|
1356
|
|
|
$i++; |
1357
|
|
|
} |
1358
|
|
|
|
1359
|
|
|
//Set color of the error bars to be that of data if not already set. |
1360
|
|
|
if (!$this->error_bar_color) { |
1361
|
|
|
reset($which_data); |
1362
|
|
|
$this->SetErrorBarColors($which_data); |
1363
|
|
|
} |
1364
|
|
|
|
1365
|
|
|
return true; |
1366
|
|
|
|
1367
|
|
|
} //function SetDataColors |
1368
|
|
|
|
1369
|
|
|
function SetErrorBarColors($which_data) { |
1370
|
|
|
|
1371
|
|
|
//Set the data to be displayed in a particular color |
1372
|
|
|
|
1373
|
|
|
if ($which_data) { |
1374
|
|
|
$this->error_bar_color = $which_data; //an array |
1375
|
|
|
unset($this->ndx_error_bar_color); |
1376
|
|
|
$i = 0; |
1377
|
|
|
foreach ($this->error_bar_color as $col) { |
1378
|
|
|
$this->ndx_error_bar_color[$i] = $this->SetIndexColor($col); |
|
|
|
|
1379
|
|
|
$i++; |
1380
|
|
|
} |
1381
|
|
|
return true; |
1382
|
|
|
} |
1383
|
|
|
return false; |
1384
|
|
|
} //function SetErrorBarColors |
1385
|
|
|
|
1386
|
|
|
|
1387
|
|
|
function DrawPlotBorder() { |
1388
|
|
|
switch ($this->plot_border_type) { |
1389
|
|
View Code Duplication |
case "left" : |
|
|
|
|
1390
|
|
|
ImageLine($this->img, $this->plot_area[0],$this->ytr($this->plot_min_y), |
1391
|
|
|
$this->plot_area[0],$this->ytr($this->plot_max_y),$this->ndx_grid_color); |
|
|
|
|
1392
|
|
|
break; |
1393
|
|
|
case "none": |
1394
|
|
|
//Draw No Border |
1395
|
|
|
break; |
1396
|
|
View Code Duplication |
default: |
|
|
|
|
1397
|
|
|
ImageRectangle($this->img, $this->plot_area[0],$this->ytr($this->plot_min_y), |
1398
|
|
|
$this->plot_area[2],$this->ytr($this->plot_max_y),$this->ndx_grid_color); |
|
|
|
|
1399
|
|
|
break; |
1400
|
|
|
} |
1401
|
|
|
$this->DrawYAxis(); |
1402
|
|
|
$this->DrawXAxis(); |
1403
|
|
|
return true; |
1404
|
|
|
} |
1405
|
|
|
|
1406
|
|
|
|
1407
|
|
|
function SetHorizTickIncrement($which_ti) { |
1408
|
|
|
//Use either this or NumHorizTicks to set where to place x tick marks |
1409
|
|
|
if ($which_ti) { |
1410
|
|
|
$this->horiz_tick_increment = $which_ti; //world coordinates |
1411
|
|
|
} else { |
1412
|
|
|
if (!$this->max_x) { |
1413
|
|
|
$this->FindDataLimits(); //Get maxima and minima for scaling |
1414
|
|
|
} |
1415
|
|
|
//$this->horiz_tick_increment = ( ceil($this->max_x * 1.2) - floor($this->min_x * 1.2) )/10; |
1416
|
|
|
$this->horiz_tick_increment = ($this->plot_max_x - $this->plot_min_x )/10; |
|
|
|
|
1417
|
|
|
} |
1418
|
|
|
$this->num_horiz_ticks = ''; //either use num_vert_ticks or vert_tick_increment, not both |
1419
|
|
|
return true; |
1420
|
|
|
} |
1421
|
|
|
|
1422
|
|
|
function SetDrawVertTicks($which_dvt) { |
1423
|
|
|
$this->draw_vert_ticks = $which_dvt; |
1424
|
|
|
return true; |
1425
|
|
|
} |
1426
|
|
|
|
1427
|
|
|
function SetVertTickIncrement($which_ti) { |
1428
|
|
|
//Use either this or NumVertTicks to set where to place y tick marks |
1429
|
|
|
if ($which_ti) { |
1430
|
|
|
$this->vert_tick_increment = $which_ti; //world coordinates |
1431
|
|
|
} else { |
1432
|
|
|
if (!$this->max_y) { |
1433
|
|
|
$this->FindDataLimits(); //Get maxima and minima for scaling |
1434
|
|
|
} |
1435
|
|
|
//$this->vert_tick_increment = ( ceil($this->max_y * 1.2) - floor($this->min_y * 1.2) )/10; |
1436
|
|
|
$this->vert_tick_increment = ($this->plot_max_y - $this->plot_min_y )/10; |
|
|
|
|
1437
|
|
|
} |
1438
|
|
|
$this->num_vert_ticks = ''; //either use num_vert_ticks or vert_tick_increment, not both |
1439
|
|
|
return true; |
1440
|
|
|
} |
1441
|
|
|
|
1442
|
|
|
function SetNumHorizTicks($which_nt) { |
1443
|
|
|
$this->num_horiz_ticks = $which_nt; |
1444
|
|
|
$this->horiz_tick_increment = ''; //either use num_horiz_ticks or horiz_tick_increment, not both |
1445
|
|
|
return true; |
1446
|
|
|
} |
1447
|
|
|
|
1448
|
|
|
function SetNumVertTicks($which_nt) { |
1449
|
|
|
$this->num_vert_ticks = $which_nt; |
1450
|
|
|
$this->vert_tick_increment = ''; //either use num_vert_ticks or vert_tick_increment, not both |
1451
|
|
|
return true; |
1452
|
|
|
} |
1453
|
|
|
function SetVertTickPosition($which_tp) { |
1454
|
|
|
$this->vert_tick_position = $which_tp; //plotleft, plotright, both, yaxis |
1455
|
|
|
return true; |
1456
|
|
|
} |
1457
|
|
|
function SetSkipBottomTick($which_sbt) { |
1458
|
|
|
$this->skip_bottom_tick = $which_sbt; |
1459
|
|
|
return true; |
1460
|
|
|
} |
1461
|
|
|
|
1462
|
|
|
function SetTickLength($which_tl) { |
1463
|
|
|
$this->tick_length = $which_tl; |
1464
|
|
|
return true; |
1465
|
|
|
} |
1466
|
|
|
|
1467
|
|
|
function DrawYAxis() { |
1468
|
|
|
//Draw Line at left side or at this->y_axis_position |
1469
|
|
View Code Duplication |
if ($this->y_axis_position != "") { |
|
|
|
|
1470
|
|
|
$yaxis_x = $this->xtr($this->y_axis_position); |
1471
|
|
|
} else { |
1472
|
|
|
$yaxis_x = $this->plot_area[0]; |
1473
|
|
|
} |
1474
|
|
|
|
1475
|
|
|
ImageLine($this->img, $yaxis_x, $this->plot_area[1], |
1476
|
|
|
$yaxis_x, $this->plot_area[3], $this->ndx_grid_color); |
|
|
|
|
1477
|
|
|
//$yaxis_x, $this->plot_area[3], 9); |
1478
|
|
|
|
1479
|
|
|
if ($this->draw_vert_ticks == 1) { |
1480
|
|
|
$this->DrawVerticalTicks(); |
1481
|
|
|
} |
1482
|
|
|
|
1483
|
|
|
} //function DrawYAxis |
1484
|
|
|
|
1485
|
|
|
function DrawXAxis() { |
1486
|
|
|
//Draw Tick and Label for Y axis |
1487
|
|
|
$ylab =$this->FormatYTickLabel($this->x_axis_position); |
1488
|
|
|
if ($this->skip_bottom_tick != 1) { |
1489
|
|
|
$this->DrawVerticalTick($ylab,$this->x_axis_position); |
1490
|
|
|
} |
1491
|
|
|
|
1492
|
|
|
//Draw X Axis at Y=$x_axis_postion |
1493
|
|
|
ImageLine($this->img,$this->plot_area[0]+1,$this->ytr($this->x_axis_position), |
1494
|
|
|
$this->xtr($this->plot_max_x)-1,$this->ytr($this->x_axis_position),$this->ndx_tick_color); |
|
|
|
|
1495
|
|
|
|
1496
|
|
|
//X Ticks and Labels |
1497
|
|
|
if ($this->data_type != 'text-data') { //labels for text-data done at data drawing time for speed. |
1498
|
|
|
$this->DrawHorizontalTicks(); |
1499
|
|
|
} |
1500
|
|
|
return true; |
1501
|
|
|
} |
1502
|
|
|
|
1503
|
|
|
function DrawHorizontalTicks() { |
1504
|
|
|
//Ticks and lables are drawn on the left border of PlotArea. |
1505
|
|
|
//Left Bottom |
1506
|
|
|
ImageLine($this->img,$this->plot_area[0], |
1507
|
|
|
$this->plot_area[3]+$this->tick_length, |
1508
|
|
|
$this->plot_area[0],$this->plot_area[3],$this->ndx_tick_color); |
|
|
|
|
1509
|
|
|
|
1510
|
|
|
switch ($this->x_grid_label_type) { |
1511
|
|
|
case "title": |
1512
|
|
|
$xlab = $this->data_values[0][0]; |
1513
|
|
|
break; |
1514
|
|
View Code Duplication |
case "data": |
|
|
|
|
1515
|
|
|
$xlab = number_format($this->plot_min_x,$this->x_precision,".",",") . "$this->si_units"; |
1516
|
|
|
break; |
1517
|
|
|
case "none": |
1518
|
|
|
$xlab = ''; |
1519
|
|
|
break; |
1520
|
|
|
case "time": //Time formatting suggested by Marlin Viss |
1521
|
|
|
$xlab = strftime($this->x_time_format,$this->plot_min_x); |
1522
|
|
|
break; |
1523
|
|
|
default: |
1524
|
|
|
//Unchanged from whatever format is passed in |
1525
|
|
|
$xlab = $this->plot_min_x; |
1526
|
|
|
break; |
1527
|
|
|
} |
1528
|
|
|
|
1529
|
|
|
if ($this->x_datalabel_angle == 90) { |
1530
|
|
|
$xpos = $this->plot_area[0] - $this->small_font_height/2; |
1531
|
|
|
$ypos = ( $this->small_font_width*strlen($xlab) + $this->plot_area[3] + $this->small_font_height); |
1532
|
|
|
ImageStringUp($this->img, $this->small_font,$xpos, $ypos, $xlab, $this->ndx_text_color); |
|
|
|
|
1533
|
|
|
} else { |
1534
|
|
|
$xpos = $this->plot_area[0] - $this->small_font_width*strlen($xlab)/2 ; |
1535
|
|
|
$ypos = $this->plot_area[3] + $this->small_font_height; |
1536
|
|
|
ImageString($this->img, $this->small_font,$xpos, $ypos, $xlab, $this->ndx_text_color); |
|
|
|
|
1537
|
|
|
} |
1538
|
|
|
|
1539
|
|
|
//Will be changed to allow for TTF fonts in data as well. |
1540
|
|
|
//$this->DrawText($this->small_font, $this->x_datalabel_angle, $xpos, $ypos, $this->ndx_title_color, '', $xlab); |
1541
|
|
|
|
1542
|
|
|
//Top |
1543
|
|
|
|
1544
|
|
|
if ($this->horiz_tick_increment) { |
1545
|
|
|
$delta_x = $this->horiz_tick_increment; |
1546
|
|
|
} elseif ($this->num_horiz_ticks) { |
1547
|
|
|
$delta_x = ($this->plot_max_x - $this->plot_min_x) / $this->num_horiz_ticks; |
1548
|
|
|
} else { |
1549
|
|
|
$delta_x =($this->plot_max_x - $this->plot_min_x) / 10 ; |
1550
|
|
|
} |
1551
|
|
|
|
1552
|
|
|
$i = 0; |
1553
|
|
|
$x_tmp = $this->plot_min_x; |
1554
|
|
|
SetType($x_tmp,'double'); |
1555
|
|
|
|
1556
|
|
|
while ($x_tmp <= $this->plot_max_x){ |
1557
|
|
|
//$xlab = sprintf("%6.1f %s",$min_x,$si_units[0]); //PHP2 past compatibility |
1558
|
|
|
switch ($this->x_grid_label_type) { |
1559
|
|
|
case "title": |
1560
|
|
|
$xlab = $this->data_values[$x_tmp][0]; |
1561
|
|
|
break; |
1562
|
|
View Code Duplication |
case "data": |
|
|
|
|
1563
|
|
|
$xlab = number_format($x_tmp,$this->x_precision,".",",") . "$this->si_units"; |
1564
|
|
|
break; |
1565
|
|
|
case "none": |
1566
|
|
|
$xlab = ''; |
1567
|
|
|
break; |
1568
|
|
|
case "time": //Time formatting suggested by Marlin Viss |
1569
|
|
|
$xlab = strftime($this->x_time_format,$x_tmp); |
1570
|
|
|
break; |
1571
|
|
|
default: |
1572
|
|
|
//Unchanged from whatever format is passed in |
1573
|
|
|
$xlab = $x_tmp; |
1574
|
|
|
break; |
1575
|
|
|
} |
1576
|
|
|
|
1577
|
|
|
$x_pixels = $this->xtr($x_tmp); |
1578
|
|
|
|
1579
|
|
|
//Bottom Tick |
1580
|
|
|
ImageLine($this->img,$x_pixels,$this->plot_area[3] + $this->tick_length, |
1581
|
|
|
$x_pixels,$this->plot_area[3], $this->ndx_tick_color); |
|
|
|
|
1582
|
|
|
//Top Tick |
1583
|
|
|
//ImageLine($this->img,($this->xtr($this->plot_max_x)+$this->tick_length), |
1584
|
|
|
// $y_pixels,$this->xtr($this->plot_max_x)-1,$y_pixels,$this->ndx_tick_color); |
1585
|
|
|
|
1586
|
|
View Code Duplication |
if ($this->draw_x_grid == 1) { |
|
|
|
|
1587
|
|
|
ImageLine($this->img,$x_pixels,$this->plot_area[1], |
1588
|
|
|
$x_pixels,$this->plot_area[3], $this->ndx_light_grid_color); |
|
|
|
|
1589
|
|
|
} |
1590
|
|
|
|
1591
|
|
|
if ($this->x_datalabel_angle == 90) { //Vertical Code Submitted by Marlin Viss |
1592
|
|
|
ImageStringUp($this->img, $this->small_font, |
1593
|
|
|
( $x_pixels - $this->small_font_height/2), |
1594
|
|
|
( $this->small_font_width*strlen($xlab) + $this->plot_area[3] + $this->small_font_height),$xlab, $this->ndx_text_color); |
|
|
|
|
1595
|
|
|
} else { |
1596
|
|
|
ImageString($this->img, $this->small_font, |
1597
|
|
|
( $x_pixels - $this->small_font_width*strlen($xlab)/2) , |
1598
|
|
|
( $this->small_font_height + $this->plot_area[3]),$xlab, $this->ndx_text_color); |
|
|
|
|
1599
|
|
|
} |
1600
|
|
|
|
1601
|
|
|
$i++; |
1602
|
|
|
$x_tmp += $delta_x; |
1603
|
|
|
} |
1604
|
|
|
|
1605
|
|
|
} // function DrawHorizontalTicks |
1606
|
|
|
|
1607
|
|
|
function FormatYTickLabel($which_ylab) { |
1608
|
|
|
switch ($this->y_grid_label_type) { |
1609
|
|
|
case "data": |
1610
|
|
|
$ylab = number_format($which_ylab,$this->y_precision,".",",") . "$this->si_units"; |
1611
|
|
|
break; |
1612
|
|
|
case "none": |
1613
|
|
|
$ylab = ''; |
1614
|
|
|
break; |
1615
|
|
|
case "time": |
1616
|
|
|
$ylab = strftime($this->y_time_format,$which_ylab); |
|
|
|
|
1617
|
|
|
break; |
1618
|
|
|
case "right": |
1619
|
|
|
//Make it right aligned |
1620
|
|
|
//$ylab = str_pad($which_ylab,$this->y_label_width," ",STR_PAD_LEFT); //PHP4 only |
1621
|
|
|
$sstr = "%".strlen($this->plot_max_y)."s"; |
1622
|
|
|
$ylab = sprintf($sstr,$which_ylab); |
1623
|
|
|
break; |
1624
|
|
|
default: |
1625
|
|
|
//Unchanged from whatever format is passed in |
1626
|
|
|
$ylab = $which_ylab; |
1627
|
|
|
break; |
1628
|
|
|
} |
1629
|
|
|
|
1630
|
|
|
return($ylab); |
1631
|
|
|
|
1632
|
|
|
} //function FormatYTickLabel |
1633
|
|
|
|
1634
|
|
|
function DrawVerticalTick($which_ylab,$which_ypos) { //ylab in world coord. |
1635
|
|
|
//Draw Just one Tick, called from DrawVerticalTicks |
1636
|
|
|
//Ticks and datalables can be left of plot only, right of plot only, |
1637
|
|
|
// both on the left and right of plot, or crossing a user defined Y-axis |
1638
|
|
|
// |
1639
|
|
|
//Its faster to draw both left and right ticks at same time |
1640
|
|
|
// than first left and then right. |
1641
|
|
|
|
1642
|
|
View Code Duplication |
if ($this->y_axis_position != "") { |
|
|
|
|
1643
|
|
|
//Ticks and lables are drawn on the left border of yaxis |
1644
|
|
|
$yaxis_x = $this->xtr($this->y_axis_position); |
1645
|
|
|
} else { |
1646
|
|
|
//Ticks and lables are drawn on the left border of PlotArea. |
1647
|
|
|
$yaxis_x = $this->plot_area[0]; |
1648
|
|
|
} |
1649
|
|
|
|
1650
|
|
|
$y_pixels = $this->ytr($which_ypos); |
1651
|
|
|
|
1652
|
|
|
//Lines Across the Plot Area |
1653
|
|
View Code Duplication |
if ($this->draw_y_grid == 1) { |
|
|
|
|
1654
|
|
|
ImageLine($this->img,$this->plot_area[0]+1,$y_pixels, |
1655
|
|
|
$this->plot_area[2]-1,$y_pixels,$this->ndx_light_grid_color); |
|
|
|
|
1656
|
|
|
} |
1657
|
|
|
|
1658
|
|
|
//Ticks to the Left of the Plot Area |
1659
|
|
View Code Duplication |
if (($this->vert_tick_position == "plotleft") || ($this->vert_tick_position == "both") ) { |
|
|
|
|
1660
|
|
|
ImageLine($this->img,(-$this->tick_length+$yaxis_x), |
1661
|
|
|
$y_pixels,$yaxis_x, |
1662
|
|
|
$y_pixels, $this->ndx_tick_color); |
|
|
|
|
1663
|
|
|
} |
1664
|
|
|
|
1665
|
|
|
//Ticks to the Right of the Plot Area |
1666
|
|
|
if (($this->vert_tick_position == "plotright") || ($this->vert_tick_position == "both") ) { |
1667
|
|
|
ImageLine($this->img,($this->plot_area[2]+$this->tick_length), |
1668
|
|
|
$y_pixels,$this->plot_area[2], |
1669
|
|
|
$y_pixels,$this->ndx_tick_color); |
|
|
|
|
1670
|
|
|
} |
1671
|
|
|
|
1672
|
|
|
//Ticks on the Y Axis |
1673
|
|
View Code Duplication |
if (($this->vert_tick_position == "yaxis") ) { |
|
|
|
|
1674
|
|
|
ImageLine($this->img,($yaxis_x - $this->tick_length), |
1675
|
|
|
$y_pixels,$yaxis_x,$y_pixels,$this->ndx_tick_color); |
|
|
|
|
1676
|
|
|
} |
1677
|
|
|
|
1678
|
|
|
//DataLabel |
1679
|
|
|
//ajo working |
1680
|
|
|
//$this->DrawText($this->y_label_ttffont, 0,($yaxis_x - $this->y_label_width - $this->tick_length/2), |
1681
|
|
|
// $y_pixels, $this->ndx_text_color, $this->axis_ttffont_size, $which_ylab); |
1682
|
|
|
ImageString($this->img, $this->small_font, ($yaxis_x - $this->y_label_width - $this->tick_length/2), |
1683
|
|
|
( -($this->small_font_height/2.0) + $y_pixels),$which_ylab, $this->ndx_text_color); |
|
|
|
|
1684
|
|
|
} |
1685
|
|
|
|
1686
|
|
|
function DrawVerticalTicks() { |
1687
|
|
|
|
1688
|
|
|
if ($this->skip_top_tick != 1) { //If tick increment doesn't hit the top |
1689
|
|
|
//Left Top |
1690
|
|
|
//ImageLine($this->img,(-$this->tick_length+$this->xtr($this->plot_min_x)), |
1691
|
|
|
// $this->ytr($this->plot_max_y),$this->xtr($this->plot_min_x),$this->ytr($this->plot_max_y),$this->ndx_tick_color); |
1692
|
|
|
//$ylab = $this->FormatYTickLabel($plot_max_y); |
1693
|
|
|
|
1694
|
|
|
//Right Top |
1695
|
|
|
//ImageLine($this->img,($this->xtr($this->plot_max_x)+$this->tick_length), |
1696
|
|
|
// $this->ytr($this->plot_max_y),$this->xtr($this->plot_max_x-1),$this->ytr($this->plot_max_y),$this->ndx_tick_color); |
1697
|
|
|
|
1698
|
|
|
//Draw Grid Line at Top |
1699
|
|
|
ImageLine($this->img,$this->plot_area[0]+1,$this->ytr($this->plot_max_y), |
1700
|
|
|
$this->plot_area[2]-1,$this->ytr($this->plot_max_y),$this->ndx_light_grid_color); |
|
|
|
|
1701
|
|
|
|
1702
|
|
|
} |
1703
|
|
|
|
1704
|
|
|
if ($this->skip_bottom_tick != 1) { |
1705
|
|
|
//Right Bottom |
1706
|
|
|
//ImageLine($this->img,($this->xtr($this->plot_max_x)+$this->tick_length), |
1707
|
|
|
// $this->ytr($this->plot_min_y),$this->xtr($this->plot_max_x), |
1708
|
|
|
// $this->ytr($this->plot_min_y),$this->ndx_tick_color); |
1709
|
|
|
|
1710
|
|
|
//Draw Grid Line at Bottom of Plot |
1711
|
|
|
ImageLine($this->img,$this->xtr($this->plot_min_x)+1,$this->ytr($this->plot_min_y), |
1712
|
|
|
$this->xtr($this->plot_max_x),$this->ytr($this->plot_min_y),$this->ndx_light_grid_color); |
|
|
|
|
1713
|
|
|
} |
1714
|
|
|
|
1715
|
|
|
// maxy is always > miny so delta_y is always positive |
1716
|
|
|
if ($this->vert_tick_increment) { |
1717
|
|
|
$delta_y = $this->vert_tick_increment; |
1718
|
|
|
} elseif ($this->num_vert_ticks) { |
1719
|
|
|
$delta_y = ($this->plot_max_y - $this->plot_min_y) / $this->num_vert_ticks; |
1720
|
|
|
} else { |
1721
|
|
|
$delta_y =($this->plot_max_y - $this->plot_min_y) / 10 ; |
1722
|
|
|
} |
1723
|
|
|
|
1724
|
|
|
$y_tmp = $this->plot_min_y; |
1725
|
|
|
SetType($y_tmp,'double'); |
1726
|
|
|
if ($this->skip_bottom_tick == 1) { |
1727
|
|
|
$y_tmp += $delta_y; |
1728
|
|
|
} |
1729
|
|
|
|
1730
|
|
|
while ($y_tmp <= $this->plot_max_y){ |
1731
|
|
|
//For log plots: |
1732
|
|
|
if (($this->yscale_type == "log") && ($this->plot_min_y == 1) && |
1733
|
|
|
($delta_y%10 == 0) && ($y_tmp == $this->plot_min_y)) { |
1734
|
|
|
$y_tmp = $y_tmp - 1; //Set first increment to 9 to get: 1,10,20,30,... |
1735
|
|
|
} |
1736
|
|
|
|
1737
|
|
|
$ylab = $this->FormatYTickLabel($y_tmp); |
1738
|
|
|
|
1739
|
|
|
$this->DrawVerticalTick($ylab,$y_tmp); |
1740
|
|
|
|
1741
|
|
|
$y_tmp += $delta_y; |
1742
|
|
|
} |
1743
|
|
|
|
1744
|
|
|
return true; |
1745
|
|
|
|
1746
|
|
|
} // function DrawVerticalTicks |
1747
|
|
|
|
1748
|
|
|
function SetTranslation() { |
1749
|
|
|
if ($this->xscale_type == "log") { |
1750
|
|
|
$this->xscale = ($this->plot_area_width)/(log10($this->plot_max_x) - log10($this->plot_min_x)); |
|
|
|
|
1751
|
|
|
} else { |
1752
|
|
|
$this->xscale = ($this->plot_area_width)/($this->plot_max_x - $this->plot_min_x); |
|
|
|
|
1753
|
|
|
} |
1754
|
|
|
if ($this->yscale_type == "log") { |
1755
|
|
|
$this->yscale = ($this->plot_area_height)/(log10($this->plot_max_y) - log10($this->plot_min_y)); |
|
|
|
|
1756
|
|
|
} else { |
1757
|
|
|
$this->yscale = ($this->plot_area_height)/($this->plot_max_y - $this->plot_min_y); |
|
|
|
|
1758
|
|
|
} |
1759
|
|
|
|
1760
|
|
|
// GD defines x=0 at left and y=0 at TOP so -/+ respectively |
1761
|
|
|
if ($this->xscale_type == "log") { |
1762
|
|
|
$this->plot_origin_x = $this->plot_area[0] - ($this->xscale * log10($this->plot_min_x) ); |
|
|
|
|
1763
|
|
|
} else { |
1764
|
|
|
$this->plot_origin_x = $this->plot_area[0] - ($this->xscale * $this->plot_min_x); |
|
|
|
|
1765
|
|
|
} |
1766
|
|
|
if ($this->yscale_type == "log") { |
1767
|
|
|
$this->plot_origin_y = $this->plot_area[3] + ($this->yscale * log10($this->plot_min_y)); |
|
|
|
|
1768
|
|
|
} else { |
1769
|
|
|
$this->plot_origin_y = $this->plot_area[3] + ($this->yscale * $this->plot_min_y); |
|
|
|
|
1770
|
|
|
} |
1771
|
|
|
|
1772
|
|
|
$this->scale_is_set = 1; |
|
|
|
|
1773
|
|
|
} // function SetTranslation |
1774
|
|
|
|
1775
|
|
|
function xtr($x_world) { |
1776
|
|
|
//Translate world coordinates into pixel coordinates |
1777
|
|
|
//The pixel coordinates are those of the ENTIRE image, not just the plot_area |
1778
|
|
|
//$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)) ; |
1779
|
|
|
//which with a little bit of math reduces to ... |
1780
|
|
|
if ($this->xscale_type == "log") { |
1781
|
|
|
$x_pixels = $this->plot_origin_x + log10($x_world) * $this->xscale ; |
|
|
|
|
1782
|
|
|
} else { |
1783
|
|
|
$x_pixels = $this->plot_origin_x + $x_world * $this->xscale ; |
|
|
|
|
1784
|
|
|
} |
1785
|
|
|
return($x_pixels); |
1786
|
|
|
} |
1787
|
|
|
|
1788
|
|
|
function ytr($y_world) { |
1789
|
|
|
// translate y world coord into pixel coord |
1790
|
|
|
if ($this->yscale_type == "log") { |
1791
|
|
|
$y_pixels = $this->plot_origin_y - log10($y_world) * $this->yscale ; //minus because GD defines y=0 at top. doh! |
|
|
|
|
1792
|
|
|
} else { |
1793
|
|
|
$y_pixels = $this->plot_origin_y - $y_world * $this->yscale ; |
|
|
|
|
1794
|
|
|
} |
1795
|
|
|
return ($y_pixels); |
1796
|
|
|
} |
1797
|
|
|
|
1798
|
|
|
|
1799
|
|
|
function DrawDataLabel($lab,$x_world,$y_world) { |
1800
|
|
|
//Depreciated. Use DrawText Instead. |
1801
|
|
|
//Data comes in in WORLD coordinates |
1802
|
|
|
//Draw data label near actual data point |
1803
|
|
|
//$y = $this->ytr($y_world) ; //in pixels |
1804
|
|
|
//$x = $this->xtr($x_world) ; |
1805
|
|
|
//$this->DrawText($which_font,$which_angle,$which_xpos,$which_ypos,$which_color,$which_size,$which_text,$which_halign='left'); |
1806
|
|
|
if ($this->use_ttf) { |
1807
|
|
|
//ajjjo |
1808
|
|
|
$lab_size = $this->TTFBBoxSize($this->axis_ttffont_size, $this->x_datalabel_angle, $this->axis_ttffont, $lab); //An array |
1809
|
|
|
$y = $this->ytr($y_world) - $lab_size[1] ; //in pixels |
1810
|
|
|
$x = $this->xtr($x_world) - $lab_size[0]/2; |
1811
|
|
|
ImageTTFText($this->img, $this->axis_ttffont_size, $this->x_datalabel_angle, $x, $y, $this->ndx_text_color, $this->axis_ttffont, $lab); |
|
|
|
|
1812
|
|
|
} else { |
1813
|
|
|
$lab_size = array($this->small_font_width*StrLen($lab), $this->small_font_height*3); |
|
|
|
|
1814
|
|
|
if ($this->x_datalabel_angle == 90) { |
1815
|
|
|
$y = $this->ytr($y_world) - $this->small_font_width*StrLen($lab); //in pixels |
1816
|
|
|
$x = $this->xtr($x_world) - $this->small_font_height; |
1817
|
|
|
ImageStringUp($this->img, $this->small_font,$x, $y ,$lab, $this->ndx_text_color); |
|
|
|
|
1818
|
|
|
} else { |
1819
|
|
|
$y = $this->ytr($y_world) - $this->small_font_height; //in pixels |
1820
|
|
|
$x = $this->xtr($x_world) - ($this->small_font_width*StrLen($lab))/2; |
1821
|
|
|
ImageString($this->img, $this->small_font,$x, $y ,$lab, $this->ndx_text_color); |
|
|
|
|
1822
|
|
|
} |
1823
|
|
|
} |
1824
|
|
|
|
1825
|
|
|
} |
1826
|
|
|
|
1827
|
|
|
function DrawXDataLabel($xlab,$xpos) { |
1828
|
|
|
//xpos comes in in PIXELS not in world coordinates. |
1829
|
|
|
//Draw an x data label centered at xlab |
1830
|
|
|
if ($this->use_ttf) { |
1831
|
|
|
$xlab_size = $this->TTFBBoxSize($this->axis_ttffont_size, |
1832
|
|
|
$this->x_datalabel_angle, $this->axis_ttffont, $xlab); //An array |
1833
|
|
|
$y = $this->plot_area[3] + $xlab_size[1] + 4; //in pixels |
1834
|
|
|
$x = $xpos - $xlab_size[0]/2; |
1835
|
|
|
ImageTTFText($this->img, $this->axis_ttffont_size, |
1836
|
|
|
$this->x_datalabel_angle, $x, $y, $this->ndx_text_color, $this->axis_ttffont, $xlab); |
|
|
|
|
1837
|
|
|
} else { |
1838
|
|
|
$xlab_size = array(ImageFontWidth($this->axis_font)*StrLen($xlab), $this->small_font_height*3); |
|
|
|
|
1839
|
|
|
if ($this->x_datalabel_angle == 90) { |
1840
|
|
|
$y = $this->plot_area[3] + ImageFontWidth($this->axis_font)*StrLen($xlab); //in pixels |
1841
|
|
|
$x = $xpos - ($this->small_font_height); |
1842
|
|
|
ImageStringUp($this->img, $this->axis_font,$x, $y ,$xlab, $this->ndx_text_color); |
|
|
|
|
1843
|
|
|
} else { |
1844
|
|
|
$y = $this->plot_area[3] + ImageFontHeight($this->axis_font); //in pixels |
1845
|
|
|
$x = $xpos - (ImageFontWidth($this->axis_font)*StrLen($xlab))/2; |
1846
|
|
|
ImageString($this->img, $this->axis_font,$x, $y ,$xlab, $this->ndx_text_color); |
|
|
|
|
1847
|
|
|
} |
1848
|
|
|
} |
1849
|
|
|
|
1850
|
|
|
} |
1851
|
|
|
|
1852
|
|
|
function DrawPieChart() { |
1853
|
|
|
//$pi = '3.14159265358979323846'; |
1854
|
|
|
$xpos = $this->plot_area[0] + $this->plot_area_width/2; |
1855
|
|
|
$ypos = $this->plot_area[1] + $this->plot_area_height/2; |
|
|
|
|
1856
|
|
|
$diameter = (min($this->plot_area_width, $this->plot_area_height)) ; |
|
|
|
|
1857
|
|
|
$radius = $diameter/2; |
1858
|
|
|
|
1859
|
|
|
ImageArc($this->img, $xpos, $ypos, $diameter, $diameter, 0, 360, $this->ndx_grid_color); |
|
|
|
|
1860
|
|
|
|
1861
|
|
|
$total = 0; |
1862
|
|
|
$tmp = $this->number_x_points - 1; |
1863
|
|
|
foreach ($this->data_values as $j => $row) { |
1864
|
|
|
//Get sum of each type |
1865
|
|
|
$color_index = 0; |
|
|
|
|
1866
|
|
|
$i = 0; |
1867
|
|
|
foreach ($row as $k => $v) { |
1868
|
|
|
if ($k != 0) { |
1869
|
|
|
if ($j == 0) { |
1870
|
|
|
$sumarr[$i] = $v; |
|
|
|
|
1871
|
|
|
} elseif ($j < $tmp) { |
1872
|
|
|
$sumarr[$i] += $v; |
|
|
|
|
1873
|
|
|
} else { |
1874
|
|
|
$sumarr[$i] += $v; |
1875
|
|
|
// NOTE! sum > 0 to make pie charts |
1876
|
|
|
$sumarr[$i] = abs($sumarr[$i]); |
1877
|
|
|
$total += $sumarr[$i]; |
1878
|
|
|
} |
1879
|
|
|
} |
1880
|
|
|
$i++; |
1881
|
|
|
} |
1882
|
|
|
} |
1883
|
|
|
|
1884
|
|
|
$color_index = 0; |
1885
|
|
|
$start_angle = 0; |
|
|
|
|
1886
|
|
|
|
1887
|
|
|
$end_angle = 0; |
1888
|
|
|
foreach ($sumarr as $val) { |
1889
|
|
|
if ($color_index >= count($this->ndx_data_color)) $color_index=0; //data_color = array |
|
|
|
|
1890
|
|
|
$label_txt = number_format(($val / $total * 100), $this->y_precision, ".", ",") . "%"; |
1891
|
|
|
$val = 360 * ($val / $total); |
1892
|
|
|
|
1893
|
|
|
$end_angle += $val; |
1894
|
|
|
$mid_angle = $end_angle - ($val / 2); |
1895
|
|
|
|
1896
|
|
|
$slicecol = $this->ndx_data_color[$color_index]; |
|
|
|
|
1897
|
|
|
|
1898
|
|
|
//Need this again for FillToBorder |
1899
|
|
|
ImageArc($this->img, $xpos, $ypos, $diameter, $diameter, 0, 360, $this->ndx_grid_color); |
|
|
|
|
1900
|
|
|
|
1901
|
|
|
$out_x = $radius * cos(deg2rad($end_angle)); |
1902
|
|
|
$out_y = - $radius * sin(deg2rad($end_angle)); |
1903
|
|
|
|
1904
|
|
|
$mid_x = $xpos + ($radius/2 * cos(deg2rad($mid_angle))) ; |
1905
|
|
|
$mid_y = $ypos + (- $radius/2 * sin(deg2rad($mid_angle))); |
1906
|
|
|
|
1907
|
|
|
$label_x = $xpos + ($radius * cos(deg2rad($mid_angle))) * $this->label_scale_position; |
1908
|
|
|
$label_y = $ypos + (- $radius * sin(deg2rad($mid_angle))) * $this->label_scale_position; |
1909
|
|
|
|
1910
|
|
|
$out_x = $xpos + $out_x; |
1911
|
|
|
$out_y = $ypos + $out_y; |
1912
|
|
|
|
1913
|
|
|
ImageLine($this->img, $xpos, $ypos, $out_x, $out_y, $this->ndx_grid_color); |
|
|
|
|
1914
|
|
|
//ImageLine($this->img, $xpos, $ypos, $label_x, $label_y, $this->ndx_grid_color); |
1915
|
|
|
ImageFillToBorder($this->img, $mid_x, $mid_y, $this->ndx_grid_color, $slicecol); |
|
|
|
|
1916
|
|
|
|
1917
|
|
|
if ($this->use_ttf) { |
1918
|
|
|
ImageTTFText($this->img, $this->axis_ttffont_size, 0, $label_x, $label_y, $this->ndx_grid_color, $this->axis_ttffont, $label_txt); |
|
|
|
|
1919
|
|
|
} else { |
1920
|
|
|
ImageString($this->img, $this->small_font, $label_x, $label_y, $label_txt, $this->ndx_grid_color); |
|
|
|
|
1921
|
|
|
} |
1922
|
|
|
|
1923
|
|
|
$start_angle = $val; |
|
|
|
|
1924
|
|
|
|
1925
|
|
|
$color_index++; |
1926
|
|
|
} |
1927
|
|
|
|
1928
|
|
|
} |
1929
|
|
|
|
1930
|
|
|
function DrawLinesError() { |
1931
|
|
|
//Draw Lines with Error Bars - data comes in as array("title",x,y,error+,error-,y2,error2+,error2-,...); |
1932
|
|
|
$start_lines = 0; |
1933
|
|
|
|
1934
|
|
|
foreach ($this->data_values as $row) { |
1935
|
|
|
$color_index = 0; |
1936
|
|
|
$i = 0; |
1937
|
|
|
|
1938
|
|
|
foreach ($row as $key => $val) { |
1939
|
|
|
//echo "$key, $i, $val<br />"; |
1940
|
|
|
if ($key == 0) { |
1941
|
|
|
$lab = $val; |
1942
|
|
|
} elseif ($key == 1) { |
1943
|
|
|
$x_now = $val; |
1944
|
|
|
$x_now_pixels = $this->xtr($x_now); //Use a bit more memory to save 2N operations. |
1945
|
|
|
} elseif ($key%3 == 2) { |
1946
|
|
|
$y_now = $val; |
1947
|
|
|
$y_now_pixels = $this->ytr($y_now); |
1948
|
|
|
|
1949
|
|
|
//Draw Data Label |
1950
|
|
|
if ( $this->draw_data_labels == 1) { |
1951
|
|
|
$this->DrawDataLabel($lab,$x_now,$y_now); |
|
|
|
|
1952
|
|
|
} |
1953
|
|
|
|
1954
|
|
|
if ($color_index >= count($this->ndx_data_color)) { $color_index=0;}; |
|
|
|
|
1955
|
|
|
$barcol = $this->ndx_data_color[$color_index]; |
|
|
|
|
1956
|
|
|
$error_barcol = $this->ndx_error_bar_color[$color_index]; |
|
|
|
|
1957
|
|
|
|
1958
|
|
|
//echo "start = $start_lines<br />"; |
1959
|
|
|
if ($start_lines == 1) { |
1960
|
|
|
for ($width = 0; $width < $this->line_width; $width++) { |
1961
|
|
|
ImageLine($this->img, $x_now_pixels, $y_now_pixels + $width, |
|
|
|
|
1962
|
|
|
$lastx[$i], $lasty[$i] + $width, $barcol); |
|
|
|
|
1963
|
|
|
} |
1964
|
|
|
} |
1965
|
|
|
|
1966
|
|
|
$lastx[$i] = $x_now_pixels; |
1967
|
|
|
$lasty[$i] = $y_now_pixels; |
1968
|
|
|
$color_index++; |
1969
|
|
|
$i++; |
1970
|
|
|
$start_lines = 1; |
1971
|
|
|
} elseif ($key%3 == 0) { |
1972
|
|
|
$this->DrawYErrorBar($x_now,$y_now,$val,$this->error_bar_shape,$error_barcol); |
|
|
|
|
1973
|
|
|
} elseif ($key%3 == 1) { |
1974
|
|
|
$this->DrawYErrorBar($x_now,$y_now,-$val,$this->error_bar_shape,$error_barcol); |
1975
|
|
|
} |
1976
|
|
|
} |
1977
|
|
|
} |
1978
|
|
|
} |
1979
|
|
|
|
1980
|
|
|
function DrawDotsError() { |
1981
|
|
|
//Draw Dots - data comes in as array("title",x,y,error+,error-,y2,error2+,error2-,...); |
1982
|
|
|
foreach ($this->data_values as $row) { |
1983
|
|
|
$color_index = 0; |
1984
|
|
|
foreach ($row as $key => $val) { |
1985
|
|
|
if ($key == 0) { |
1986
|
|
|
} elseif ($key == 1) { |
1987
|
|
|
$xpos = $val; |
1988
|
|
|
} elseif ($key%3 == 2) { |
1989
|
|
|
if ($color_index >= count($this->ndx_data_color)) $color_index=0; |
|
|
|
|
1990
|
|
|
$barcol = $this->ndx_data_color[$color_index]; |
|
|
|
|
1991
|
|
|
$error_barcol = $this->ndx_error_bar_color[$color_index]; |
|
|
|
|
1992
|
|
|
$ypos = $val; |
1993
|
|
|
|
1994
|
|
|
$color_index++; |
1995
|
|
|
$this->DrawDot($xpos,$ypos,$this->point_shape,$barcol); |
|
|
|
|
1996
|
|
|
} elseif ($key%3 == 0) { |
1997
|
|
|
$this->DrawYErrorBar($xpos,$ypos,$val,$this->error_bar_shape,$error_barcol); |
|
|
|
|
1998
|
|
|
} elseif ($key%3 == 1) { |
1999
|
|
|
$mine = $val ; |
|
|
|
|
2000
|
|
|
$this->DrawYErrorBar($xpos,$ypos,-$val,$this->error_bar_shape,$error_barcol); |
2001
|
|
|
} |
2002
|
|
|
} |
2003
|
|
|
} |
2004
|
|
|
|
2005
|
|
|
} |
2006
|
|
|
|
2007
|
|
|
function DrawDots() { |
2008
|
|
|
//Draw Dots - data comes in as array("title",x,y1,y2,y3,...); |
2009
|
|
|
foreach ($this->data_values as $j => $row) { |
2010
|
|
|
$color_index = 0; |
2011
|
|
|
foreach ($row as $k => $v) { |
2012
|
|
|
if ($k == 0) { |
2013
|
|
|
} elseif (($k == 1) && ($this->data_type == "data-data")) { |
2014
|
|
|
$xpos = $v; |
2015
|
|
|
} else { |
2016
|
|
|
if ($this->data_type == "text-data") { |
2017
|
|
|
$xpos = ($j+.5); |
2018
|
|
|
} |
2019
|
|
|
if ($color_index >= count($this->ndx_data_color)) $color_index=0; |
|
|
|
|
2020
|
|
|
$barcol = $this->ndx_data_color[$color_index]; |
|
|
|
|
2021
|
|
|
|
2022
|
|
|
//if (is_numeric($v)) //PHP4 only |
2023
|
|
|
if ((strval($v) != "") ) { //Allow for missing Y data |
2024
|
|
|
$this->DrawDot($xpos,$v,$this->point_shape,$barcol); |
|
|
|
|
2025
|
|
|
} |
2026
|
|
|
$color_index++; |
2027
|
|
|
} |
2028
|
|
|
} |
2029
|
|
|
} |
2030
|
|
|
|
2031
|
|
|
} //function DrawDots |
2032
|
|
|
|
2033
|
|
|
function DrawDotSeries() { |
2034
|
|
|
//Depreciated: Use DrawDots |
2035
|
|
|
$this->DrawDots(); |
2036
|
|
|
} |
2037
|
|
|
|
2038
|
|
|
function DrawThinBarLines() { |
2039
|
|
|
//A clean,fast routine for when you just want charts like stock volume charts |
2040
|
|
|
//Data must be text-data since I didn't see a graphing need for equally spaced thin lines. |
2041
|
|
|
//If you want it - then write to [email protected] and I might add it. |
2042
|
|
|
|
2043
|
|
|
if ($this->data_type != "data-data") { $this->DrawError('Data Type for ThinBarLines must be data-data'); }; |
2044
|
|
|
$y1 = $this->ytr($this->x_axis_position); |
2045
|
|
|
|
2046
|
|
|
foreach ($this->data_values as $row) { |
2047
|
|
|
$color_index = 0; |
2048
|
|
|
foreach ($row as $k => $v) { |
2049
|
|
|
if ($k == 0) { |
2050
|
|
|
$xlab = $v; |
2051
|
|
|
} elseif ($k == 1) { |
2052
|
|
|
$xpos = $this->xtr($v); |
2053
|
|
|
if ( ($this->draw_x_data_labels == 1) ) { //See "labels_note1 above. |
2054
|
|
|
$this->DrawXDataLabel($xlab,$xpos); |
|
|
|
|
2055
|
|
|
} |
2056
|
|
|
} else { |
2057
|
|
|
if ($color_index >= count($this->ndx_data_color)) $color_index=0; |
|
|
|
|
2058
|
|
|
$barcol = $this->ndx_data_color[$color_index]; |
|
|
|
|
2059
|
|
|
|
2060
|
|
|
ImageLine($this->img,$xpos,$y1,$xpos,$this->ytr($v),$barcol); |
|
|
|
|
2061
|
|
|
$color_index++; |
2062
|
|
|
} |
2063
|
|
|
} |
2064
|
|
|
} |
2065
|
|
|
|
2066
|
|
|
} //function DrawThinBarLines |
2067
|
|
|
|
2068
|
|
|
function DrawYErrorBar($x_world,$y_world,$error_height,$error_bar_type,$color) { |
2069
|
|
|
$x1 = $this->xtr($x_world); |
2070
|
|
|
$y1 = $this->ytr($y_world); |
2071
|
|
|
$y2 = $this->ytr($y_world+$error_height) ; |
2072
|
|
|
|
2073
|
|
|
for ($width = 0; $width < $this->error_bar_line_width; $width++) { |
2074
|
|
|
ImageLine($this->img, $x1+$width, $y1 , $x1+$width, $y2, $color); |
2075
|
|
|
ImageLine($this->img, $x1-$width, $y1 , $x1-$width, $y2, $color); |
2076
|
|
|
} |
2077
|
|
|
switch ($error_bar_type) { |
2078
|
|
|
case "line": |
2079
|
|
|
break; |
2080
|
|
View Code Duplication |
case "tee": |
|
|
|
|
2081
|
|
|
ImageLine($this->img, $x1-$this->error_bar_size, $y2, $x1+$this->error_bar_size, $y2, $color); |
2082
|
|
|
break; |
2083
|
|
View Code Duplication |
default: |
|
|
|
|
2084
|
|
|
ImageLine($this->img, $x1-$this->error_bar_size, $y2, $x1+$this->error_bar_size, $y2, $color); |
2085
|
|
|
break; |
2086
|
|
|
} |
2087
|
|
|
return true; |
2088
|
|
|
} |
2089
|
|
|
|
2090
|
|
|
function DrawDot($x_world,$y_world,$dot_type,$color) { |
2091
|
|
|
$half_point = $this->point_size / 2; |
2092
|
|
|
$x1 = $this->xtr($x_world) - $half_point; |
2093
|
|
|
$x2 = $this->xtr($x_world) + $half_point; |
2094
|
|
|
$y1 = $this->ytr($y_world) - $half_point; |
2095
|
|
|
$y2 = $this->ytr($y_world) + $half_point; |
2096
|
|
|
|
2097
|
|
|
switch ($dot_type) { |
2098
|
|
|
case "halfline": |
2099
|
|
|
ImageFilledRectangle($this->img, $x1, $this->ytr($y_world), $this->xtr($x_world), $this->ytr($y_world), $color); |
2100
|
|
|
break; |
2101
|
|
|
case "line": |
2102
|
|
|
ImageFilledRectangle($this->img, $x1, $this->ytr($y_world), $x2, $this->ytr($y_world), $color); |
2103
|
|
|
break; |
2104
|
|
|
case "rect": |
2105
|
|
|
ImageFilledRectangle($this->img, $x1, $y1, $x2, $y2, $color); |
2106
|
|
|
break; |
2107
|
|
|
case "circle": |
2108
|
|
|
ImageArc($this->img, $x1 + $half_point, $y1 + $half_point, $this->point_size, $this->point_size, 0, 360, $color); |
2109
|
|
|
break; |
2110
|
|
|
case "dot": |
2111
|
|
|
ImageArc($this->img, $x1 + $half_point, $y1 + $half_point, $this->point_size, $this->point_size, 0, 360, $color); |
2112
|
|
|
ImageFillToBorder($this->img, $x1 + $half_point, $y1 + $half_point, $color, $color); |
2113
|
|
|
break; |
2114
|
|
|
case "diamond": |
2115
|
|
|
|
2116
|
|
|
$arrpoints = array( |
2117
|
|
|
$x1,$y1 + $half_point, |
2118
|
|
|
$x1 + $half_point, $y1, |
2119
|
|
|
$x2,$y1 + $half_point, |
2120
|
|
|
$x1 + $half_point, $y2 |
2121
|
|
|
); |
2122
|
|
|
|
2123
|
|
|
ImageFilledPolygon($this->img, $arrpoints, 4, $color); |
2124
|
|
|
break; |
2125
|
|
|
case "triangle": |
2126
|
|
|
$arrpoints = array( $x1, $y1 + $half_point, |
2127
|
|
|
$x2, $y1 + $half_point, |
2128
|
|
|
$x1 + $half_point, $y2 |
2129
|
|
|
); |
2130
|
|
|
ImageFilledPolygon($this->img, $arrpoints, 3, $color); |
2131
|
|
|
break; |
2132
|
|
|
default: |
2133
|
|
|
ImageFilledRectangle($this->img, $x1, $y1, $x2, $y2, $color); |
2134
|
|
|
break; |
2135
|
|
|
} |
2136
|
|
|
return true; |
2137
|
|
|
} |
2138
|
|
|
|
2139
|
|
|
function SetErrorBarLineWidth($which_seblw) { |
2140
|
|
|
$this->error_bar_line_width = $which_seblw; |
2141
|
|
|
return true; |
2142
|
|
|
} |
2143
|
|
|
|
2144
|
|
|
|
2145
|
|
|
function SetLineWidth($which_lw) { |
2146
|
|
|
$this->line_width = $which_lw; |
2147
|
|
|
if (!$this->error_bar_line_width) { |
2148
|
|
|
$this->error_bar_line_width = $which_lw; |
2149
|
|
|
} |
2150
|
|
|
return true; |
2151
|
|
|
} |
2152
|
|
|
|
2153
|
|
|
function DrawArea() { |
2154
|
|
|
//Data comes in as $data[]=("title",x,y,...); |
2155
|
|
|
//Set first and last datapoints of area |
2156
|
|
|
$i = 0; |
2157
|
|
View Code Duplication |
while ($i < $this->records_per_group) { |
|
|
|
|
2158
|
|
|
$posarr[$i][] = $this->xtr($this->min_x); //x initial |
|
|
|
|
2159
|
|
|
$posarr[$i][] = $this->ytr($this->x_axis_position); //y initial |
|
|
|
|
2160
|
|
|
$i++; |
2161
|
|
|
} |
2162
|
|
|
|
2163
|
|
|
foreach ($this->data_values as $j => $row) { |
2164
|
|
|
$color_index = 0; |
2165
|
|
|
foreach ($row as $k => $v) { |
2166
|
|
|
if ($k == 0) { |
2167
|
|
|
//Draw Data Labels |
2168
|
|
|
$xlab = SubStr($v,0,$this->x_datalabel_maxlength); |
|
|
|
|
2169
|
|
|
} elseif ($k == 1) { |
2170
|
|
|
$x = $this->xtr($v); |
2171
|
|
|
// DrawXDataLabel interferes with Numbers on x-axis |
2172
|
|
|
//$this->DrawXDataLabel($xlab,$x); |
2173
|
|
|
} else { |
2174
|
|
|
// Create Array of points for later |
2175
|
|
|
|
2176
|
|
|
$y = $this->ytr($v); |
2177
|
|
|
$posarr[$color_index][] = $x; |
|
|
|
|
2178
|
|
|
$posarr[$color_index][] = $y; |
2179
|
|
|
$color_index++; |
2180
|
|
|
} |
2181
|
|
|
} |
2182
|
|
|
} |
2183
|
|
|
|
2184
|
|
|
//Final_points |
2185
|
|
View Code Duplication |
for ($i = 0; $i < $this->records_per_group; $i++) { |
|
|
|
|
2186
|
|
|
$posarr[$i][] = $this->xtr($this->max_x); //x final |
2187
|
|
|
$posarr[$i][] = $this->ytr($this->x_axis_position); //y final |
2188
|
|
|
} |
2189
|
|
|
|
2190
|
|
|
$color_index=0; |
2191
|
|
|
|
2192
|
|
View Code Duplication |
foreach ($posarr as $row) { |
|
|
|
|
2193
|
|
|
if ($color_index >= count($this->ndx_data_color)) $color_index=0; |
|
|
|
|
2194
|
|
|
$barcol = $this->ndx_data_color[$color_index]; |
|
|
|
|
2195
|
|
|
//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<br />"; |
2196
|
|
|
ImageFilledPolygon($this->img, $row, (count($row)) / 2, $barcol); |
2197
|
|
|
$color_index++; |
2198
|
|
|
} |
2199
|
|
|
//exit; |
2200
|
|
|
|
2201
|
|
|
} |
2202
|
|
|
|
2203
|
|
|
function DrawAreaSeries() { |
2204
|
|
|
|
2205
|
|
|
//Set first and last datapoints of area |
2206
|
|
|
$i = 0; |
2207
|
|
View Code Duplication |
while ($i < $this->records_per_group) { |
|
|
|
|
2208
|
|
|
$posarr[$i][] = $this->xtr(.5); //x initial |
|
|
|
|
2209
|
|
|
$posarr[$i][] = $this->ytr($this->x_axis_position); //y initial |
|
|
|
|
2210
|
|
|
$i++; |
2211
|
|
|
} |
2212
|
|
|
|
2213
|
|
|
foreach ($this->data_values as $j => $row) { |
2214
|
|
|
$color_index = 0; |
2215
|
|
|
foreach ($row as $k => $v) { |
2216
|
|
|
if ($k == 0) { |
2217
|
|
|
//Draw Data Labels |
2218
|
|
|
$xlab = SubStr($v,0,$this->x_datalabel_maxlength); |
2219
|
|
|
$this->DrawXDataLabel($xlab,$this->xtr($j + .5)); |
2220
|
|
|
} else { |
2221
|
|
|
// Create Array of points for later |
2222
|
|
|
|
2223
|
|
|
$x = round($this->xtr($j + .5 )); |
2224
|
|
|
$y = round($this->ytr($v)); |
2225
|
|
|
$posarr[$color_index][] = $x; |
2226
|
|
|
$posarr[$color_index][] = $y; |
2227
|
|
|
$color_index++; |
2228
|
|
|
} |
2229
|
|
|
} |
2230
|
|
|
} |
2231
|
|
|
|
2232
|
|
|
//Final_points |
2233
|
|
View Code Duplication |
for ($i = 0; $i < $this->records_per_group; $i++) { |
|
|
|
|
2234
|
|
|
$posarr[$i][] = round($this->xtr($this->max_x + .5)); //x final |
2235
|
|
|
$posarr[$i][] = $this->ytr($this->x_axis_position); //y final |
2236
|
|
|
} |
2237
|
|
|
|
2238
|
|
|
$color_index=0; |
2239
|
|
|
|
2240
|
|
View Code Duplication |
foreach ($posarr as $row) { |
|
|
|
|
2241
|
|
|
if ($color_index >= count($this->ndx_data_color)) $color_index=0; |
|
|
|
|
2242
|
|
|
$barcol = $this->ndx_data_color[$color_index]; |
|
|
|
|
2243
|
|
|
//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<br />"; |
2244
|
|
|
ImageFilledPolygon($this->img, $row, (count($row)) / 2, $barcol); |
2245
|
|
|
$color_index++; |
2246
|
|
|
} |
2247
|
|
|
|
2248
|
|
|
} |
2249
|
|
|
|
2250
|
|
|
function DrawLines() { |
2251
|
|
|
//Data comes in as $data[]=("title",x,y,...); |
2252
|
|
|
$start_lines = 0; |
2253
|
|
|
if ($this->data_type == "text-data") { |
2254
|
|
|
$lastx[0] = $this->xtr(0); |
|
|
|
|
2255
|
|
|
$lasty[0] = $this->xtr(0); |
|
|
|
|
2256
|
|
|
} |
2257
|
|
|
|
2258
|
|
|
foreach ($this->data_values as $j => $row) { |
2259
|
|
|
$color_index = 0; |
2260
|
|
|
$i = 0; |
2261
|
|
|
foreach ($row as $k => $v) { |
2262
|
|
|
if ($k == 0) { |
2263
|
|
|
$xlab = SubStr($v,0,$this->x_datalabel_maxlength); |
2264
|
|
|
} elseif (($k == 1) && ($this->data_type == "data-data")) { |
2265
|
|
|
$x_now = $this->xtr($v); |
2266
|
|
|
} else { |
2267
|
|
|
//(double) $v; |
2268
|
|
|
// Draw Lines |
2269
|
|
|
if ($this->data_type == "text-data") { |
2270
|
|
|
$x_now = $this->xtr($j+.5); |
2271
|
|
|
} |
2272
|
|
|
|
2273
|
|
|
//if (is_numeric($v)) //PHP4 only |
2274
|
|
|
if ((strval($v) != "") ) { //Allow for missing Y data |
2275
|
|
|
$y_now = $this->ytr($v); |
2276
|
|
|
if ($color_index >= count($this->ndx_data_color)) { $color_index=0;} ; |
|
|
|
|
2277
|
|
|
$barcol = $this->ndx_data_color[$color_index]; |
|
|
|
|
2278
|
|
|
|
2279
|
|
|
if ($start_lines == 1) { |
2280
|
|
|
for ($width = 0; $width < $this->line_width; $width++) { |
2281
|
|
|
if ($this->line_style[$i] == "dashed") { |
2282
|
|
|
$this->DrawDashedLine($x_now, $y_now + $width, $lastx[$i], $lasty[$i] + $width, 4,4, $barcol); |
|
|
|
|
2283
|
|
|
} else { |
2284
|
|
|
ImageLine($this->img, $x_now, $y_now + $width, $lastx[$i], $lasty[$i] + $width, $barcol); |
2285
|
|
|
} |
2286
|
|
|
} |
2287
|
|
|
} |
2288
|
|
|
$lastx[$i] = $x_now; |
2289
|
|
|
} else { |
2290
|
|
|
$y_now = $lasty[$i]; |
2291
|
|
|
//Don't increment lastx[$i] |
2292
|
|
|
} |
2293
|
|
|
//$bordercol = $this->ndx_data_border_color[$colbarcount]; |
2294
|
|
|
|
2295
|
|
|
$lasty[$i] = $y_now; |
2296
|
|
|
$color_index++; |
2297
|
|
|
$i++; |
2298
|
|
|
} |
2299
|
|
|
//Now we are assured an x_value |
2300
|
|
|
if ( ($this->draw_x_data_labels == 1) && ($k == 1) ) { //See "labels_note1 above. |
2301
|
|
|
$this->DrawXDataLabel($xlab,$x_now); |
|
|
|
|
2302
|
|
|
} |
2303
|
|
|
} //while rows of data |
2304
|
|
|
$start_lines = 1; |
2305
|
|
|
} |
2306
|
|
|
} |
2307
|
|
|
|
2308
|
|
|
//Data comes in as $data[]=("title",x,y,e+,e-,y2,e2+,e2-,...); |
2309
|
|
|
|
2310
|
|
|
function DrawLineSeries() { |
2311
|
|
|
//This function is replaced by DrawLines |
2312
|
|
|
//Tests have shown not much improvement in speed by having separate routines for DrawLineSeries and DrawLines |
2313
|
|
|
//For ease of programming I have combined them |
2314
|
|
|
return false; |
2315
|
|
|
} //function DrawLineSeries |
2316
|
|
|
|
2317
|
|
|
function DrawDashedLine($x1pix,$y1pix,$x2pix,$y2pix,$dash_length,$dash_space,$color) { |
2318
|
|
|
//Code based on work by Ariel Garza and James Pine |
2319
|
|
|
//I've decided to have this be in pixels only as a replacement for ImageLine |
2320
|
|
|
//$x1pix = $this->xtr($x1); |
2321
|
|
|
//$y1pix = $this->ytr($y1); |
2322
|
|
|
//$x2pix = $this->xtr($x2); |
2323
|
|
|
//$y2pix = $this->ytr($y2); |
2324
|
|
|
|
2325
|
|
|
// Get the length of the line in pixels |
2326
|
|
|
$line_length = ceil (sqrt(pow(($x2pix - $x1pix),2) + pow(($y2pix - $y1pix),2)) ); |
2327
|
|
|
|
2328
|
|
|
$dx = ($x2pix - $x1pix) / $line_length; |
2329
|
|
|
$dy = ($y2pix - $y1pix) / $line_length; |
2330
|
|
|
$lastx = $x1pix; |
2331
|
|
|
$lasty = $y1pix; |
2332
|
|
|
|
2333
|
|
|
// Draw the dashed line |
2334
|
|
|
for ($i = 0; $i < $line_length; $i += ($dash_length + $dash_space)) { |
2335
|
|
|
$xpix = ($dash_length * $dx) + $lastx; |
2336
|
|
|
$ypix = ($dash_length * $dy) + $lasty; |
2337
|
|
|
|
2338
|
|
|
ImageLine($this->img,$lastx,$lasty,$xpix,$ypix,$color); |
2339
|
|
|
$lastx = $xpix + ($dash_space * $dx); |
2340
|
|
|
$lasty = $ypix + ($dash_space * $dy); |
2341
|
|
|
} |
2342
|
|
|
} // function DrawDashedLine |
2343
|
|
|
|
2344
|
|
|
function DrawBars() { |
2345
|
|
|
|
2346
|
|
|
if ($this->data_type != "text-data") { |
2347
|
|
|
$this->DrawError('Bar plots must be text-data: use function SetDataType("text-data")'); |
2348
|
|
|
} |
2349
|
|
|
|
2350
|
|
|
$xadjust = ($this->records_per_group * $this->record_bar_width )/4; |
|
|
|
|
2351
|
|
|
|
2352
|
|
|
foreach ($this->data_values as $j => $row) { |
2353
|
|
|
$color_index = 0; |
2354
|
|
|
$colbarcount = 0; |
2355
|
|
|
$x_now = $this->xtr($j+.5); |
2356
|
|
|
|
2357
|
|
|
foreach ($row as $k => $v) { |
2358
|
|
|
if ($k == 0) { |
2359
|
|
|
//Draw Data Labels |
2360
|
|
|
$xlab = SubStr($v,0,$this->x_datalabel_maxlength); |
2361
|
|
|
$this->DrawXDataLabel($xlab,$x_now); |
2362
|
|
|
} else { |
2363
|
|
|
// Draw Bars ($v) |
2364
|
|
|
$x1 = $x_now - $this->data_group_space + ($k-1)*$this->record_bar_width; |
2365
|
|
|
$x2 = $x1 + $this->record_bar_width*$this->bar_width_adjust; |
2366
|
|
|
|
2367
|
|
|
if ($v < $this->x_axis_position) { |
2368
|
|
|
$y1 = $this->ytr($this->x_axis_position); |
2369
|
|
|
$y2 = $this->ytr($v); |
2370
|
|
|
} else { |
2371
|
|
|
$y1 = $this->ytr($v); |
2372
|
|
|
$y2 = $this->ytr($this->x_axis_position); |
2373
|
|
|
} |
2374
|
|
|
|
2375
|
|
|
if ($color_index >= count($this->ndx_data_color)) $color_index=0; |
|
|
|
|
2376
|
|
|
if ($colbarcount >= count($this->ndx_data_border_color)) $colbarcount=0; |
|
|
|
|
2377
|
|
|
$barcol = $this->ndx_data_color[$color_index]; |
|
|
|
|
2378
|
|
|
$bordercol = $this->ndx_data_border_color[$colbarcount]; |
|
|
|
|
2379
|
|
|
|
2380
|
|
|
if ((strval($v) != "") ) { //Allow for missing Y data |
2381
|
|
|
if ($this->shading > 0) { |
2382
|
|
|
for($i=0;$i<($this->shading);$i++) { |
2383
|
|
|
//Shading set in SetDefaultColors |
2384
|
|
|
ImageFilledRectangle($this->img, $x1+$i, $y1-$i, $x2+$i, $y2-$i, $this->ndx_i_light); |
|
|
|
|
2385
|
|
|
} |
2386
|
|
|
} |
2387
|
|
|
|
2388
|
|
|
ImageFilledRectangle($this->img, $x1, $y1, $x2, $y2, $barcol); |
2389
|
|
|
ImageRectangle($this->img, $x1, $y1, $x2, $y2, $bordercol); |
2390
|
|
|
if ($this->draw_data_labels == '1') { //ajo |
2391
|
|
|
$y1 = $this->ytr($this->label_scale_position * $v); |
2392
|
|
|
//$this->DrawDataLabel($v,$j + .5,$v*$this->label_scale_position); |
2393
|
|
|
$this->DrawText($this->x_label_ttffont, $this->x_label_angle, |
2394
|
|
|
$x1+$this->record_bar_width/2, $y1, $this->ndx_label_color, $this->x_label_ttffont_size, $v,'center','top'); |
|
|
|
|
2395
|
|
|
} |
2396
|
|
|
} |
2397
|
|
|
|
2398
|
|
|
$color_index++; |
2399
|
|
|
$colbarcount++; |
2400
|
|
|
} |
2401
|
|
|
} |
2402
|
|
|
} |
2403
|
|
|
} //function DrawBars |
2404
|
|
|
|
2405
|
|
|
function DrawLegend($which_x1,$which_y1,$which_boxtype) { |
|
|
|
|
2406
|
|
|
//Base code submitted by Marlin Viss |
2407
|
|
|
$max_legend_length=0; |
2408
|
|
|
foreach ($this->legend as $leg) { |
|
|
|
|
2409
|
|
|
$len = strlen($leg); |
2410
|
|
|
if ($max_legend_length < $len) { |
2411
|
|
|
$max_legend_length = $len; |
2412
|
|
|
} |
2413
|
|
|
} |
2414
|
|
|
|
2415
|
|
|
$line_spacing = 1.25; |
2416
|
|
|
$vert_margin = $this->small_font_height/2 ; |
2417
|
|
|
$dot_height = $this->small_font_height*$line_spacing - 1; |
2418
|
|
|
|
2419
|
|
|
//Upper Left |
2420
|
|
|
if ((!$which_x1) || (!$which_y1) ) { |
2421
|
|
|
$box_start_x = $this->plot_area[2] - $this->small_font_width*($max_legend_length+4); |
2422
|
|
|
$box_start_y = $this->plot_area[1] + 4; |
2423
|
|
|
} else { |
2424
|
|
|
$box_start_x = $which_x1; |
2425
|
|
|
$box_start_y = $which_y1; |
2426
|
|
|
} |
2427
|
|
|
|
2428
|
|
|
//Lower Right |
2429
|
|
|
$box_end_y = $box_start_y + $this->small_font_height*(count($this->legend)+1) + 2*$vert_margin; |
2430
|
|
|
//$box_end_x = $this->plot_area[2] - 5; |
2431
|
|
|
$box_end_x = $box_start_x + $this->small_font_width*($max_legend_length+4) - 5; |
2432
|
|
|
|
2433
|
|
|
|
2434
|
|
|
// Draw box for legend |
2435
|
|
|
ImageFilledRectangle($this->img, |
2436
|
|
|
$box_start_x, $box_start_y,$box_end_x, |
2437
|
|
|
$box_end_y, $this->ndx_bg_color); |
|
|
|
|
2438
|
|
|
ImageRectangle($this->img, |
2439
|
|
|
$box_start_x, $box_start_y,$box_end_x, |
2440
|
|
|
$box_end_y, $this->ndx_grid_color); |
|
|
|
|
2441
|
|
|
|
2442
|
|
|
$color_index=0; |
2443
|
|
|
$i = 0; |
2444
|
|
|
|
2445
|
|
|
|
2446
|
|
|
foreach ($this->legend as $leg) { |
|
|
|
|
2447
|
|
|
$y_pos = $box_start_y + $this->small_font_height*($i)*($line_spacing) + $vert_margin; |
2448
|
|
|
|
2449
|
|
|
ImageString($this->img, $this->small_font, |
2450
|
|
|
$box_start_x + $this->small_font_width*( $max_legend_length - strlen($leg) + 1 ) , |
2451
|
|
|
$y_pos, |
2452
|
|
|
$leg, $this->ndx_text_color); |
|
|
|
|
2453
|
|
|
|
2454
|
|
|
if ($color_index >= count($this->ndx_data_color)) $color_index=0; |
|
|
|
|
2455
|
|
|
// Draw a box in the data color |
2456
|
|
|
ImageFilledRectangle($this->img, |
2457
|
|
|
$box_end_x - $this->small_font_width*2, |
2458
|
|
|
$y_pos + 1, $box_end_x - $this->small_font_width, |
2459
|
|
|
$y_pos + $dot_height, |
2460
|
|
|
$this->ndx_data_color[$color_index]); |
|
|
|
|
2461
|
|
|
|
2462
|
|
|
ImageRectangle($this->img, |
2463
|
|
|
$box_end_x - $this->small_font_width*2, |
2464
|
|
|
$y_pos + 1, $box_end_x - $this->small_font_width, |
2465
|
|
|
$y_pos + $dot_height, |
2466
|
|
|
$this->ndx_text_color); |
|
|
|
|
2467
|
|
|
$i++; |
2468
|
|
|
$color_index++; |
2469
|
|
|
} |
2470
|
|
|
} //function DrawLegend |
2471
|
|
|
|
2472
|
|
|
|
2473
|
|
|
function DrawGraph() { |
2474
|
|
|
|
2475
|
|
|
if (($this->img) == "") { |
2476
|
|
|
$this->DrawError('No Image Defined: DrawGraph'); |
2477
|
|
|
//$this->PHPlot(); |
2478
|
|
|
} |
2479
|
|
|
|
2480
|
|
|
if (! is_array($this->data_values)) { |
2481
|
|
|
$this->DrawBackground(); |
2482
|
|
|
$this->DrawError("No array of data in \$data_values"); |
2483
|
|
|
} else { |
2484
|
|
|
if (!$this->data_color) { |
2485
|
|
|
$this->SetDataColors(array('blue','green','yellow','red','orange','blue'),array('black')); |
2486
|
|
|
} |
2487
|
|
|
|
2488
|
|
|
$this->FindDataLimits(); //Get maxima and minima for scaling |
2489
|
|
|
|
2490
|
|
|
$this->SetXLabelHeight(); //Get data for bottom margin |
2491
|
|
|
|
2492
|
|
|
$this->SetYLabelWidth(); //Get data for left margin |
2493
|
|
|
|
2494
|
|
|
if (!$this->plot_area_width) { |
2495
|
|
|
$this->SetPlotAreaPixels('','','',''); //Set Margins |
2496
|
|
|
} |
2497
|
|
|
|
2498
|
|
|
if (!$this->plot_max_y) { //If not set by user call SetPlotAreaWorld, |
2499
|
|
|
$this->SetPlotAreaWorld('','','',''); |
2500
|
|
|
} |
2501
|
|
|
|
2502
|
|
|
if ($this->data_type == "text-data") { |
2503
|
|
|
$this->SetEqualXCoord(); |
2504
|
|
|
} |
2505
|
|
|
|
2506
|
|
|
$this->SetPointSize($this->point_size); |
2507
|
|
|
|
2508
|
|
|
$this->DrawBackground(); |
2509
|
|
|
$this->DrawImageBorder(); |
2510
|
|
|
|
2511
|
|
|
$this->SetTranslation(); |
2512
|
|
|
|
2513
|
|
|
if ($this->draw_plot_area_background == 1) { |
2514
|
|
|
$this->DrawPlotAreaBackground(); |
2515
|
|
|
} |
2516
|
|
|
//$foo = "$this->max_y, $this->min_y, $new_miny, $new_maxy, $this->x_label_height"; |
2517
|
|
|
//ImageString($this->img, 4, 20, 20, $foo, $this->ndx_text_color); |
2518
|
|
|
|
2519
|
|
|
switch ($this->plot_type) { |
2520
|
|
|
case "bars": |
2521
|
|
|
$this->DrawPlotBorder(); |
2522
|
|
|
$this->DrawLabels(); |
2523
|
|
|
$this->DrawBars(); |
2524
|
|
|
$this->DrawXAxis(); |
2525
|
|
|
break; |
2526
|
|
|
case "thinbarline": |
2527
|
|
|
$this->DrawPlotBorder(); |
2528
|
|
|
$this->DrawLabels(); |
2529
|
|
|
$this->DrawThinBarLines(); |
2530
|
|
|
break; |
2531
|
|
View Code Duplication |
case "lines": |
|
|
|
|
2532
|
|
|
$this->DrawPlotBorder(); |
2533
|
|
|
$this->DrawLabels(); |
2534
|
|
|
if ( $this->data_type == "text-data") { |
2535
|
|
|
$this->DrawLines(); |
2536
|
|
|
} elseif ( $this->data_type == "data-data-error") { |
2537
|
|
|
$this->DrawLinesError(); |
2538
|
|
|
} else { |
2539
|
|
|
$this->DrawLines(); |
2540
|
|
|
} |
2541
|
|
|
break; |
2542
|
|
|
case "area": |
2543
|
|
|
$this->DrawPlotBorder(); |
2544
|
|
|
$this->DrawLabels(); |
2545
|
|
|
if ( $this->data_type == "text-data") { |
2546
|
|
|
$this->DrawAreaSeries(); |
2547
|
|
|
} else { |
2548
|
|
|
$this->DrawArea(); |
2549
|
|
|
} |
2550
|
|
|
break; |
2551
|
|
|
case "linepoints": |
2552
|
|
|
$this->DrawPlotBorder(); |
2553
|
|
|
$this->DrawLabels(); |
2554
|
|
|
if ( $this->data_type == "text-data") { |
2555
|
|
|
$this->DrawLines(); |
2556
|
|
|
$this->DrawDots(); |
2557
|
|
|
} elseif ( $this->data_type == "data-data-error") { |
2558
|
|
|
$this->DrawLinesError(); |
2559
|
|
|
$this->DrawDotsError(); |
2560
|
|
|
} else { |
2561
|
|
|
$this->DrawLines(); |
2562
|
|
|
$this->DrawDots(); |
2563
|
|
|
} |
2564
|
|
|
break; |
2565
|
|
View Code Duplication |
case "points"; |
|
|
|
|
2566
|
|
|
$this->DrawPlotBorder(); |
2567
|
|
|
$this->DrawLabels(); |
2568
|
|
|
if ( $this->data_type == "text-data") { |
2569
|
|
|
$this->DrawDots(); |
2570
|
|
|
} elseif ( $this->data_type == "data-data-error") { |
2571
|
|
|
$this->DrawDotsError(); |
2572
|
|
|
} else { |
2573
|
|
|
$this->DrawDots(); |
2574
|
|
|
} |
2575
|
|
|
break; |
2576
|
|
|
case "pie": |
2577
|
|
|
$this->DrawPieChart(); |
2578
|
|
|
$this->DrawLabels(); |
2579
|
|
|
break; |
2580
|
|
|
default: |
2581
|
|
|
$this->DrawPlotBorder(); |
2582
|
|
|
$this->DrawLabels(); |
2583
|
|
|
$this->DrawBars(); |
2584
|
|
|
break; |
2585
|
|
|
} |
2586
|
|
|
|
2587
|
|
|
if ($this->legend) { |
2588
|
|
|
$this->DrawLegend($this->legend_x_pos,$this->legend_y_pos,''); |
2589
|
|
|
} |
2590
|
|
|
|
2591
|
|
|
} |
2592
|
|
|
if ($this->print_image == 1) { |
2593
|
|
|
$this->PrintImage(); |
2594
|
|
|
} |
2595
|
|
|
} //function DrawGraph |
2596
|
|
|
|
2597
|
|
|
} |
2598
|
|
|
|
2599
|
|
|
// $graph = new PHPlot; |
2600
|
|
|
|
2601
|
|
|
// $graph->DrawGraph(); |
2602
|
|
|
|
2603
|
|
|
?> |
|
|
|
|
2604
|
|
|
|
In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:
Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion: