/ Published in: PHP
Released under the MIT license by Josh Atkins. Requires Antialiased filled Arcs/Ellipses for PHP by Ulrich Mierendorff (also under the MIT license).
Expand |
Embed | Plain Text
<?php require_once('imageSmoothArc.php'); global $font_path; $font_path = 'C:/Windows/Fonts/arialbd.ttf'; function get_dimensions_from_bbox($bbox) { } function new_piechart($radius, $data, $title) { $title_dimensions = get_dimensions_from_bbox(imagettfbbox(28, 0, $GLOBALS['font_path'], $title)); // work out dimensions of the title $max_label_width = 0; for($i=0;$i<count($data_values);$i++) { $labels[$i][] = $data_labels[$i] . ' (' . $data_values[$i] . ' / ' . round($data_values[$i]/$total_value*100) . '%)'; // "label (value/percentage)" $labels[$i][] = get_dimensions_from_bbox(imagettfbbox(12, 0, $GLOBALS['font_path'], $labels[$i][0])); // work out the dimensions of the label if($labels[$i][1]['width']>$max_label_width) $max_label_width = $labels[$i][1]['width']; } $title_pie_gap = 30; $pie_legend_gap = 30; $legend_gaps = 5; $extra_width = 5; $extra_height = 5; imagealphablending($piechart, true); // for anti-aliasing imagefilledrectangle($piechart, 0, 0, imagesx($piechart), imagesy($piechart), imagecolorallocate($piechart, 255, 255, 255)); // make the background white imagettftext($piechart, 28, 0, imagesx($piechart)/2-$title_dimensions['width']/2, 28, null, $GLOBALS['font_path'], $title); // write the title $current_angle = 0; foreach($data_values as $value) { $colors[] = array($colors_rgb[0] - 50, $colors_rgb[1] - 50, $colors_rgb[2] - 50, 0); // last value of 0 means complete opaqueness $current_angle += $value / $total_value * 360; // update for the starting angle of the next segment } for($n=60;$n>50;$n--) { for($m=0;$m<count($angles);$m++) imageSmoothArc($piechart, imagesx($piechart)/2, $title_dimensions['height']+$title_pie_gap+$n, $radius, $radius * 0.5, $three_d_colors[$m], $angles[$m][0], $angles[$m][1]); // draw segment } $current_angle = 0; $i = 0; foreach($data_values as $value) { // iterate through values, printing and coloring segments for each $current_angle += $value / $total_value * 360; // update for the starting angle of the next segment $i++; } // START: Legend $legend_offset_top = $title_dimensions['height']+$title_pie_gap+$radius/2+$pie_legend_gap; for($i=0;$i<count($data_values);$i++) { $label_left = imagesx($piechart)/2-(16+5+$max_label_width)/2; imagefilledrectangle($piechart, $label_left, $legend_offset_top, $label_left+16, $legend_offset_top+16, imagecolorallocate($piechart, $colors[$i][0], $colors[$i][1], $colors[$i][2])); // draw a box for color-coding imagettftext($piechart, 12, 0, $label_left + 16 + 5, $legend_offset_top + 16, imagecolorallocate($piechart, $colors[$i][0], $colors[$i][1], $colors[$i][2]), $GLOBALS['font_path'], $labels[$i][0]); // write the label $legend_offset_top += 16 + $legend_gaps; } // END: Legend imagepng($piechart); } function new_barchart($chart_width, $data, $axes, $title) { // chart width = bar_width * bar_count + bar_spacing * (bar_count - 1) + vertical_axis_width+vertical_axis_label_width // chart height = title_height + max_bar_height + horizontal_axis_height $bar_spacing = 10; $axis_width = 5; $max_value = 0; $bar_count = 0; foreach($data as $barset) { $values[] = $barset_values; foreach($barset_values as $value) { $bar_count++; if($value>$max_value) $max_value = $value; } } $title_dimensions = get_dimensions_from_bbox(imagettfbbox(48, 0, $GLOBALS['font_path'], $title)); $horizontal_axis_label_dimensions = get_dimensions_from_bbox(imagettfbbox(14, 0, $GLOBALS['font_path'], $axes[0])); $vertical_axis_label_dimensions = get_dimensions_from_bbox(imagettfbbox(14, 90, $GLOBALS['font_path'], $axes[1])); $max_label_width = 0; $m = 0; for($n=0;$n<count($data);$n++) { for($i=0;$i<count($data[$n]);$i++) { $legend_labels[$m][] = $labels[$n][$i] . ' (' . $values[$n][$i] . ')'; // "label (value)" $legend_labels[$m][] = get_dimensions_from_bbox(imagettfbbox(12, 0, $GLOBALS['font_path'], $legend_labels[$m][0])); // work out the dimensions of the label if($legend_labels[$m][1]['width']>$max_label_width) $max_label_width = $legend_labels[$m][1]['width']; $m++; } } $max_label_width += $axis_width; if($title_dimensions['width']>$chart_width) $chart_width = $title_dimensions['width']; $max_value_label = imagettfbbox(12, 0, $GLOBALS['font_path'], $max_value); $max_value_label_dimensions = get_dimensions_from_bbox($max_value_label); $chart_width += $max_value_label_dimensions['width'] + 25; $chart_height = $chart_width * 1.5; $scale_factor = ($chart_height - $axis_width - $title_dimensions['height']) / $max_value; $max_bar_height = $title_dimensions['height'] + $max_value * $scale_factor + $max_label_width; $bar_width = ($chart_width - $max_value_label_dimensions['width'] - $vertical_axis_label_dimensions['width'] - 25 - $axis_width - ($bar_spacing * count($data))) / $bar_count; $barchart = imagecreatetruecolor($chart_width, $max_bar_height); imagefilledrectangle($barchart, 0, 0, imagesx($barchart), imagesy($barchart), imagecolorallocate($barchart, 255, 255, 255)); // fill the background white imagettftext($barchart, 48, 0, imagesx($barchart)/2-$title_dimensions['width']/2, 48, null, $GLOBALS['font_path'], $title); imagefilledrectangle($barchart, 25 + $max_value_label_dimensions['width'], $max_bar_height - $max_label_width + $axis_width - $max_value * $scale_factor, 25 + $axis_width + $max_value_label_dimensions['width'], $max_bar_height - $max_label_width, 0); // draw y-axis imagefilledrectangle($barchart, 25 + $max_value_label_dimensions['width'], $max_bar_height - $max_label_width, imagesx($barchart), $max_bar_height - $max_label_width - $axis_width, 0); // draw x-axis $label_gaps = abs(($max_bar_height - $max_label_width + $axis_width - $max_value * $scale_factor) - ($max_bar_height - $max_label_width - $axis_width)) / 9; for($i=0;$i<10;$i++) { imagefilledrectangle($barchart, $max_value_label_dimensions['width'], $max_bar_height - $max_label_width + $axis_width - $max_value * $scale_factor + $i * $label_gaps, $max_value_label_dimensions['width'] + 25, $axis_width + $max_bar_height - $max_label_width + $axis_width - $max_value * $scale_factor + $i * $label_gaps, 0); //imagettftext($barchart, 12, 0, 0, $axis_width + $max_bar_height - $max_label_width + $axis_width - $max_value * $scale_factor + $i * $label_gaps, 0, $GLOBALS['font_path'], round($max_value - ($max_value / 9 * $i))); imagettftext($barchart, 12, 0, 0, $axis_width + $max_bar_height - $max_label_width + $axis_width - $max_value * $scale_factor + $i * $label_gaps + 3, 0, $GLOBALS['font_path'], round($max_value - ($max_value / 9 * $i))); } $prev_bar_x = 25 + $max_value_label_dimensions['width'] + $axis_width + 1; $y_axis_height = abs(($max_bar_height - $max_label_width + $axis_width - $max_value * $scale_factor) - ($max_bar_height - $axis_width - 1 - $max_label_width)); for($i=0;$i<count($data);$i++) { for($n=0;$n<count($data[$i]);$n++) { //$values[$i][$n] * $scale_factor //$max_bar_height - $max_label_width - 1 - $axis_width //imagesy($barchart) - 1 - $axis_width - $max_label_width $bar_height = $values[$i][$n]*($y_axis_height/$max_value); imagefilledrectangle($barchart, $prev_bar_x, $max_bar_height - $max_label_width - $axis_width - $bar_height, $prev_bar_x + $bar_width, $max_bar_height - $axis_width - 1 - $max_label_width, $colors[$n]); $prev_bar_x += $bar_width + 1; } $prev_bar_x += $bar_spacing; } // START: Legend $legend_offset_top = $max_bar_height - $max_label_width + 1; $legend_gaps = 10; $label_left = $max_value_label_dimensions['width'] + $axis_width*2 + 16 + $bar_width/2 - 8; $n = 0; $i = 0; for($n=0;$n<count($labels);$n++) { $m = 0; foreach($labels[$n] as $label) { imagettftext($barchart, 12, 90, $label_left + 16, imagesy($barchart) + $axis_width - abs($legend_labels[$i][1]['width'] - $max_label_width), $colors[$m], $GLOBALS['font_path'], $legend_labels[$i][0]); // write the label $label_left += $bar_width; $i++; $m++; } $label_left += $bar_spacing; } // END: Legend imagepng($barchart); } /*if(isset($_GET['pie'])) new_piechart(200, array('Apple'=>123, 'Orange'=>456, 'Banana'=>789, 'Pineapple'=>520), 'Fruits'); else new_barchart(200, array(array('Apple #1'=>100, 'Apple #2'=>200, 'Apple #3'=>300), array('Orange #1' => 200, 'Orange #2' => 300, 'Orange #3' => 400), array('Banana #1' => 300, 'Banana #2' => 400, 'Banana #3' => 500, 'Apple Pie' => 400)), array('X Axis', 'Y Axis'), 'A');*/ else { for($i=0;$i<count($_GET['labels']);$i++) { for($n=0;$n<count($labels);$n++) $barset[$labels[$n]] = $values[$n]; $data[] = $barset; } } ?>
You need to login to post a comment.
