App-Widget-ChartDirector
view release on metacpan or search on metacpan
lib/App/Widget/ChartDirector.pm view on Meta::CPAN
$spec->{stacked} = 0; # stacking is done for us in the area layer
}
else {
$layer = $c->addLineLayer2();
$layer->setLineWidth(2);
}
$layer->set3D(5) if ($spec->{"3D"});
if ($#$yn > 0) {
my ($stacked_y, $y, $dataset);
if ($spec->{stacked}) {
$stacked_y = [ ]; # make a copy
}
my $y_labels = $spec->{y_labels} || [];
for (my $i = 0; $i <= $#$yn; $i++) {
$y = $yn->[$i];
if ($spec->{stacked}) {
for (my $j = 0; $j <= $#$y; $j++) {
$stacked_y->[$j] += $y->[$j];
}
$y = $stacked_y;
}
#$dataset = $layer->addDataSet($y, -1, $y_labels->[$i]);
################
#we choose colors from @color_set
if($i <= 18) { # RNS 070831-000229
if ($#$data_set_colors != -1) {
$dataset = $layer->addDataSet($y, $data_set_colors->[$i], $y_labels->[$i]);
} else {
$dataset = $layer->addDataSet($y, hex($color_set[$i]), $y_labels->[$i]);
}
}
else {
#if number of y_labels is greater than 20, colors will be repeated
#we have declared only 20 colors
$dataset = $layer->addDataSet($y, hex($color_set[($i-19)]), $y_labels->[$i]); # RNS 070831-000229
}
###############
$dataset->setDataSymbol($self->sym($i, \@symbols)) if ($spec->{points});
}
}
elsif ($#$yn > -1) {
$layer = $c->addLineLayer($yn->[0]);
$layer->setLineWidth(2);
}
if ($spec->{point_labels}) {
my $label_format = $spec->{point_labels};
$label_format = "{value|0}" if ($label_format eq "1");
$layer->setDataLabelFormat($label_format);
}
$self->set_x_axis($spec, $c, $layer, $x);
$c->makeChart($spec->{image_path});
&App::sub_exit() if ($App::trace);
}
sub sym {
&App::sub_entry if ($App::trace);
my ($self, $series, $symbols) = @_;
my $idx = $series % ($#$symbols + 1);
my $symboldef = $symbols->[$idx];
&App::sub_exit($symboldef->{symbol}, $symboldef->{size}) if ($App::trace);
return($symboldef->{symbol}, $symboldef->{size});
}
##Add a legend box at (400, 100)
#$c->addLegend(400, 100);
##Add a stacked bar layer and set the layer 3D depth to 8 pixels
#my $layer = $c->addBarLayer2($perlchartdir::Stack, 8);
##Add the three data sets to the bar layer
#$layer->addDataSet($data0, 0xff8080, "Server # 1");
#$layer->addDataSet($data1, 0x80ff80, "Server # 2");
#$layer->addDataSet($data2, 0x8080ff, "Server # 3");
# TODO: this needs more work before it really works
sub write_meter_graph_image {
&App::sub_entry if ($App::trace);
my ($self, $spec) = @_;
my $c = $self->new_meter_chart($spec);
my $x = $self->get_x($spec);
my $yn = $self->get_y($spec) || [[]];
my $value = $yn->[0][0];
my $radius = $spec->{radius};
my $center_x = $spec->{center_x};
my $center_y = $spec->{center_y};
#my $y_max = $spec->{y_max} || 100;
my $y_max = $value || 100;
my ($major_tick, $minor_tick, $micro_tick);
{
my $y_mantissa = $y_max;
my $y_scale = 1;
while ($y_mantissa > 1.0) {
$y_mantissa /= 10;
$y_scale *= 10;
}
if ($y_mantissa > 0.5) {
$y_max = $y_scale;
$minor_tick = $y_max/10;
$micro_tick = $y_max/20;
}
elsif ($y_mantissa > 0.2) {
$y_max = 0.5 * $y_scale;
$minor_tick = $y_max/25;
$micro_tick = undef;
}
else {
$y_max = 0.2 * $y_scale;
$minor_tick = $y_max/10;
$micro_tick = $y_max/20;
}
$major_tick = $y_max/5;
}
my $y_red = $spec->{y_red} || ($y_max * 0.80);
my $y_yellow = $spec->{y_yellow} || ($y_max * 0.60);
#Meter scale is 0 - 100, with major tick every 20 units, minor tick every 10
#units, and micro tick every 5 units
$c->setScale(0, $y_max, $major_tick, $minor_tick, $micro_tick);
( run in 2.017 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )