You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

244 lines
11 KiB

#!/usr/bin/perl -w
#
# $Id: bargraph_multi.pm
#
use strict;
package bargraph_multi ;
require Exporter ;
@bargraph_multi::ISA = qw(Exporter) ;
@bargraph_multi::EXPORT = qw(Build_Labeled_X_Axis_Graph_Str Build_Labeled_X_Axis_Graph_Obj) ;
@bargraph_multi::EXPORT_OK = qw( ) ;
use GD;
use GD::Graph::colour;
use GD::Graph::bars;
use GD::Graph::hbars;
use GD::Graph::bars3d;
#use Data::Dumper;
# This perl code is builds Graphs using the GD::Graph modules.
# This code deals with a non-numeric X-Axis. Each tick on the X-Axis is the name of a group.
# The other style has a numeric X-Axis.
sub Build_Labeled_X_Axis_Graph_Str {
# The parameters are:
# $Data_In - A reference to a list of lists. (aka, Array of Arrays)
# Each of the sublists has the same number of elements.
# An element might be the undef value.
# The first sublist is the names of the groups.
# The other sublists are related to the elements in the $Legend parameter.
# $Legend - A reference to a list.
# Each element of the list is the name of a group.
# The data for each group is a sublist in the $Data_In parameter.
# ---- The rest of the parameters are individual options as scalars: numbers, character strings, or undef.
# The returned value is a list of (reference to the plotted graphical object, and graphic string in the mode.
my ($Data_In, $Legend, $Graphic_Mode, $xdim, $ydim, $hbar, $title, $xlabel, $ylabel,
$ymax, $ymin, $yticknum, $t_margin, $b_margin, $l_margin, $r_margin,
$colorscheme, $bar_spacing, $bargroup_spacing,
$show_values, $x_label_position, $y_label_position, $transparent, $overwrite,
$interlaced, $bgclr, $fgclr, $boxclr, $accentclr, $shadowclr, $shadow_depth,
$labelclr, $axislabelclr, $legendclr, $valuesclr, $textclr, $dclrs, $borderclrs,
$cycle_clrs, $accent_treshold, $long_ticks, $tick_length, $x_ticks, $y_number_format,
$x_label_skip, $y_label_skip, $x_last_label_skip, $x_tick_offset, $x_all_ticks,
$x_label_position, $y_label_position, $x_labels_vertical, $x_plot_values, $y_plot_values,
$box_axis, $no_axes, $two_axes, $use_axis, $zero_axis, $zero_axis_only, $axis_space,
$text_space, $cumulate, $overwrite, $correct_width, $values_vertical, $values_space,
$values_format, $legend_placement, $legend_marker_width, $legend_marker_height, $lg_cols
) = @_ ;
my $Graph_Obj = &Build_Labeled_X_Axis_Graph_Obj
($Data_In, $Legend, $xdim, $ydim, $hbar, $title, $xlabel, $ylabel,
$ymax, $ymin, $yticknum, $t_margin, $b_margin, $l_margin, $r_margin,
$colorscheme, $bar_spacing, $bargroup_spacing,
$show_values, $x_label_position, $y_label_position, $transparent, $overwrite,
$interlaced, $bgclr, $fgclr, $boxclr, $accentclr, $shadowclr, $shadow_depth,
$labelclr, $axislabelclr, $legendclr, $valuesclr, $textclr, $dclrs, $borderclrs,
$cycle_clrs, $accent_treshold, $long_ticks, $tick_length, $x_ticks, $y_number_format,
$x_label_skip, $y_label_skip, $x_last_label_skip, $x_tick_offset, $x_all_ticks,
$x_label_position, $y_label_position, $x_labels_vertical, $x_plot_values, $y_plot_values,
$box_axis, $no_axes, $two_axes, $use_axis, $zero_axis, $zero_axis_only, $axis_space,
$text_space, $cumulate, $overwrite, $correct_width, $values_vertical, $values_space,
$values_format, $legend_placement, $legend_marker_width, $legend_marker_height, $lg_cols ) ;
my $Plotted_Str ;
unless (defined $Graph_Obj) {
return (undef, "") ;
} else {
if ($Graphic_Mode =~ m/png/i) {
$Plotted_Str = $Graph_Obj -> png ;
} elsif ($Graphic_Mode =~ m/gif/i) {
$Plotted_Str = $Graph_Obj -> gif ;
} else {
return ($Graphic_Mode, "Unsupported Graphical Mode $Graph_Obj.\n") ;
}
}
return ($Graph_Obj, $Plotted_Str) ;
}
sub Build_Labeled_X_Axis_Graph_Obj {
my ($Data_In, $Legend, $xdim, $ydim, $hbar, $title, $xlabel, $ylabel,
$ymax, $ymin, $yticknum, $t_margin, $b_margin, $l_margin, $r_margin,
$colorscheme, $bar_spacing, $bargroup_spacing,
$show_values, $x_label_position, $y_label_position, $transparent, $overwrite,
$interlaced, $bgclr, $fgclr, $boxclr, $accentclr, $shadowclr, $shadow_depth,
$labelclr, $axislabelclr, $legendclr, $valuesclr, $textclr, $dclrs, $borderclrs,
$cycle_clrs, $accent_treshold, $long_ticks, $tick_length, $x_ticks, $y_number_format,
$x_label_skip, $y_label_skip, $x_last_label_skip, $x_tick_offset, $x_all_ticks,
$x_label_position, $y_label_position, $x_labels_vertical, $x_plot_values, $y_plot_values,
$box_axis, $no_axes, $two_axes, $use_axis, $zero_axis, $zero_axis_only, $axis_space,
$text_space, $cumulate, $overwrite, $correct_width, $values_vertical, $values_space,
$values_format, $legend_placement, $legend_marker_width, $legend_marker_height, $lg_cols ) = @_ ;
# $colorscheme is a colon seperated string of colors.
my $HBI_Debug_Obj = 1 ;
my $Data_In_sublist ; my $Data_In_cnt = 0 ;
if ($HBI_Debug_Obj) {
warn "INFO: " . __FILE__ . " Legend array len is $#{$Legend}.\n" ;
foreach $Data_In_sublist (@{$Data_In}) {
warn "INFO: Data array len is $#{$Data_In_sublist}.\n" ;
$Data_In_cnt ++ ;
}
warn "INFO: Data array $Data_In_cnt elements.\n" ;
}
my $graph;
if ($hbar) {
#print STDERR "hbar set\n";
$graph = GD::Graph::hbars->new($xdim,$ydim);
} else {
$graph = GD::Graph::bars->new($xdim,$ydim);
#print STDERR "hbar not set\n";
}
my @ret_colour_names_avail = () ;
my %valid_colour_name = () ;
@ret_colour_names_avail = GD::Graph::colour::colour_list(59) ;
for my $clr_name (@ret_colour_names_avail) {
if (defined $clr_name) {$valid_colour_name{$clr_name} = 1;}
}
# The keys of the hash array valid_colour_name are the known color names.
# warn $full_colour_list ;
# warn "The number of colours is $#ret_colour_names_avail ." ;
# The colors I found at one time are: pink lbrown lred purple
# dblue lpurple green white gold blue dyellow red lgreen marine
# dred cyan yellow lblue orange lgray dgreen dbrown lyellow
# black gray dpink dgray lorange dpurple
# Set blue yellow if the colorscheme parameter is 1.
# else use the default.
if ($colorscheme and $colorscheme ==1) {
$graph->set( dclrs => [ qw(blue yellow) ] );
} elsif ($colorscheme) {
my @new_colors = split /:/ , $colorscheme ;
my $index = 0 ;
my $colors = $graph->get('dclrs');
my $color ;
foreach $color (@new_colors) {
if ($valid_colour_name{$color} ) {
# warn "Pushed $color ." ;
$colors->[$index] = $color ;
$index ++ ;
} else {
warn "Invalid color $color requested." ;
}
}
# warn "Setting dclrs." ;
$graph->set( dclrs => $colors) ;
# warn "Set dclrs." ;
}
my %opt = ('transparent' => 0,
'x_label_position' => 0.5,
'show_values' => 1,
'y_max_value' => 100,
'overwrite' => 0);
if ($title) {$opt{'title'} = $title;}
if ($xlabel) {$opt{'x_label'} = $xlabel;}
if ($ylabel) {$opt{'y_label'} = $ylabel;}
if ($ymax) {$opt{'y_max_value'} = $ymax;}
if ($ymin) {$opt{'y_min_value'} = $ymin;}
if ($t_margin) {$opt{'t_margin'} = $t_margin;}
if ($b_margin) {$opt{'b_margin'} = $b_margin;}
if ($l_margin) {$opt{'l_margin'} = $l_margin;}
if ($r_margin) {$opt{'r_margin'} = $r_margin;}
if ($yticknum) {$opt{'y_tick_number'} = $yticknum;}
if ($bar_spacing) {$opt{'bar_spacing'} = $bar_spacing;}
if ($bargroup_spacing) {$opt{'bargroup_spacing'} = $bargroup_spacing;}
if ($show_values) {$opt{'show_values'} = $show_values;}
if ($x_label_position) {$opt{'x_label_position'} = $x_label_position;}
if ($y_label_position) {$opt{'y_label_position'} = $y_label_position;}
if ($transparent) {$opt{'transparent'} = $transparent;}
if ($overwrite) {$opt{'overwrite'} = $overwrite;}
if ($interlaced) {$opt{'interlaced'} = $interlaced;}
if ($bgclr) {$opt{'bgclr'} = $bgclr;}
if ($fgclr) {$opt{'fgclr'} = $fgclr;}
if ($boxclr) {$opt{'boxclr'} = $boxclr;}
if ($accentclr) {$opt{'accentclr'} = $accentclr;}
if ($shadowclr) {$opt{'shadowclr'} = $shadowclr;}
if ($shadow_depth) {$opt{'shadow_depth'} = $shadow_depth;}
if ($labelclr) {$opt{'labelclr'} = $labelclr ;}
if ($axislabelclr) {$opt{'axislabelclr'} = $axislabelclr ;}
if ($legendclr) {$opt{'legendclr'} = $legendclr ;}
if ($valuesclr) {$opt{'valuesclr'} = $valuesclr ;}
if ($textclr) {$opt{'textclr'} = $textclr ;}
if ($dclrs) {$opt{'dclrs'} = $dclrs ;}
if ($borderclrs) {$opt{'borderclrs'} = $borderclrs ;}
if ($cycle_clrs) {$opt{'cycle_clrs'} = $cycle_clrs ;}
if ($accent_treshold) {$opt{'accent_treshold'} = $accent_treshold ;}
if ($long_ticks) {$opt{'long_ticks'} = $long_ticks ;}
if ($tick_length) {$opt{'tick_length'} = $tick_length ;}
if ($x_ticks) {$opt{'x_ticks'} = $x_ticks ;}
if ($y_number_format) {$opt{'y_number_format'} = $y_number_format ;}
if ($x_label_skip) {$opt{'x_label_skip'} = $x_label_skip ;}
if ($y_label_skip) {$opt{'y_label_skip'} = $y_label_skip ;}
if ($x_last_label_skip) {$opt{'x_last_label_skip'} = $x_last_label_skip ;}
if ($x_tick_offset) {$opt{'x_tick_offset'} = $x_tick_offset ;}
if ($x_all_ticks) {$opt{'x_all_ticks'} = $x_all_ticks ;}
if ($x_label_position) {$opt{'x_label_position'} = $x_label_position ;}
if ($y_label_position) {$opt{'y_label_position'} = $y_label_position ;}
if ($x_labels_vertical) {$opt{'x_labels_vertical'} = $x_labels_vertical ;}
if ($x_plot_values) {$opt{'x_plot_values'} = $x_plot_values ;}
if ($y_plot_values) {$opt{'y_plot_values'} = $y_plot_values ;}
if ($box_axis) {$opt{'box_axis'} = $box_axis ;}
if ($no_axes) {$opt{'no_axes'} = $no_axes ;}
if ($two_axes) {$opt{'two_axes'} = $two_axes ;}
if ($use_axis) {$opt{'use_axis'} = $use_axis ;}
if ($zero_axis) {$opt{'zero_axis'} = $zero_axis ;}
if ($zero_axis_only) {$opt{'zero_axis_only'} = $zero_axis_only ;}
if ($axis_space) {$opt{'axis_space'} = $axis_space ;}
if ($text_space) {$opt{'text_space'} = $text_space ;}
if ($cumulate) {$opt{'cumulate'} = $cumulate ;}
if ($overwrite) {$opt{'overwrite'} = $overwrite ;}
if ($correct_width) {$opt{'correct_width'} = $correct_width ;}
if ($values_vertical) {$opt{'values_vertical'} = $values_vertical ;}
if ($values_space) {$opt{'values_space'} = $values_space ;}
if ($values_format) {$opt{'values_format'} = $values_format ;}
if ($legend_placement) {$opt{'legend_placement'} = $legend_placement ;}
if ($legend_marker_width) {$opt{'legend_marker_width'} = $legend_marker_width ;}
if ($legend_marker_height) {$opt{'legend_marker_height'} = $legend_marker_height ;}
if ($lg_cols) {$opt{'lg_cols'} = $lg_cols ;}
if ((defined $Legend) && (ref($Legend) eq "ARRAY") && ($#{${Legend}} >= 0)) {
$graph -> set_legend(@{$Legend}) ;
} else {
warn "ERROR: Empty Legend array passed to XXX." ;
}
$graph->set(%opt) or die $graph->error;
$graph->set_title_font(gdGiantFont);
$graph->set_x_label_font(gdGiantFont);
$graph->set_y_label_font(gdGiantFont);
$graph->set_x_axis_font(gdGiantFont);
$graph->set_y_axis_font(gdGiantFont);
$graph->set_values_font(gdGiantFont);
$graph->set_legend_font(gdGiantFont);
my $gd = $graph->plot($Data_In) ;
return $gd
}
1 ;