cvsuser 05/11/08 19:39:37
Modified: App-Widget-ChartDirector/lib/App/Widget ChartDirector.pm
Log:
use continuous rather than enumerated x-axis for numeric and date dimensions
Revision Changes Path
1.3 +66 -44
p5ee/App-Widget-ChartDirector/lib/App/Widget/ChartDirector.pm
Index: ChartDirector.pm
===================================================================
RCS file:
/cvs/public/p5ee/App-Widget-ChartDirector/lib/App/Widget/ChartDirector.pm,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- ChartDirector.pm 8 Nov 2005 17:43:46 -0000 1.2
+++ ChartDirector.pm 9 Nov 2005 03:39:36 -0000 1.3
@@ -10,6 +10,9 @@
use App::Widget::Graph;
@ISA = ( "App::Widget::Graph" );
+use Date::Format;
+use Date::Parse;
+
use strict;
=head1 NAME
@@ -280,39 +283,6 @@
$legend->setMargin(5);
}
- #if ($x && $#$x > -1) {
- # if ($x->[0] =~ /^([0-9]{4})-([0-9]{2})-([0-9]{2})$/) {
- # my $begin_yr = $1;
- # my $begin_mon = $2;
- # my $begin_day = $3;
- # my $begin_time = &perlchartdir::chartTime($1, $2, $3);
- # my ($end_time, $end_yr, $end_mon, $end_day);
- # if ($x->[$#$x] =~ /^([0-9]{4})-([0-9]{2})-([0-9]{2})$/) {
- # $end_yr = $1;
- # $end_mon = $2;
- # $end_day = $3;
- # $end_time = &perlchartdir::chartTime($1, $2, $3);
- # }
- # $c->xAxis()->setDateScale($begin_time, $end_time);
- # my (@x_date);
- # for (my $i = 0; $i <= $#$x; $i++) {
- # if ($x->[$i] =~ /^([0-9]{4})-([0-9]{2})-([0-9]{2})$/) {
- # $x_date[$i] = &perlchartdir::chartTime($1, $2, $3);
- # }
- # else {
- # $x_date[$i] = $perlchartdir::NoValue;
- # }
- # }
- # $spec->{x} = [EMAIL PROTECTED];
- # #$c->xAxis()->setDateFormat("{value|mm/dd}");
- # }
- # else {
- # $c->xAxis()->setLabels($x);
- # }
- #}
- $c->xAxis()->setLabels($x);
-
- $c->xAxis()->setTitle($spec->{x_title}) if ($spec->{x_title});
$c->yAxis()->setTitle($spec->{y_title}) if ($spec->{y_title});
$c->setBackground(0xbbbbff);
#$c->setBackground(perlchartdir::metalColor(0xaaaaff));
@@ -406,11 +376,11 @@
my $c = $self->new_xy_chart($spec);
my $x = $self->get_x($spec);
my $yn = $self->get_y($spec);
+ my ($layer);
if ($#$yn > 0) {
if ($spec->{stacked}) {
my $three_d_depth = $spec->{"3D"} ? 8 : 0;
- my $layer = $c->addBarLayer2($perlchartdir::Stack,
$three_d_depth);
- #$layer->setXData($x);
+ $layer = $c->addBarLayer2($perlchartdir::Stack, $three_d_depth);
my $y_labels = $spec->{y_labels} || [];
for (my $i = 0; $i <= $#$yn; $i++) {
$layer->addDataSet($yn->[$i], -1, $y_labels->[$i]);
@@ -421,8 +391,7 @@
#$layer->setDataLabelStyle();
}
else {
- my $layer = $c->addBarLayer2($perlchartdir::Side, $#$yn + 1);
- #$layer->setXData($x);
+ $layer = $c->addBarLayer2($perlchartdir::Side, $#$yn + 1);
my $y_labels = $spec->{y_labels} || [];
for (my $i = 0; $i <= $#$yn; $i++) {
$layer->addDataSet($yn->[$i], -1, $y_labels->[$i]);
@@ -445,14 +414,63 @@
}
}
elsif ($#$yn > -1) {
- my $layer = $c->addBarLayer($yn->[0]);
- #$layer->setXData($x);
+ $layer = $c->addBarLayer($yn->[0]);
$layer->set3D() if ($spec->{"3D"});
}
+
+ $self->set_x_axis($spec, $c, $layer, $x);
+
$c->makeChart($spec->{image_path});
&App::sub_exit() if ($App::trace);
}
+sub set_x_axis {
+ my ($self, $spec, $chart, $layer, $x) = @_;
+ my $x_title = $spec->{x_title} || "";
+ if ($x && $#$x > -1) {
+ my ($begin_datetime, $end_datetime, $begin_time, $end_time,
$begin_yr, $end_yr);
+ if ($x->[0] =~ /^[0-9]{4}-[0-9]{2}-[0-9]{2}$/) {
+ #my $bar_offset = ($spec->{graphtype} =~ /bar/) ? 24*3600 : 0;
+ my $bar_offset = 0;
+ $begin_datetime = $bar_offset ? time2str("%Y-%m-%d",
str2time($x->[0]) - $bar_offset) : $x->[0];
+ if ($begin_datetime =~ /^([0-9]{4})-([0-9]{2})-([0-9]{2})$/) {
+ $begin_yr = $1;
+ $begin_time = &perlchartdir::chartTime($1, $2, $3);
+ }
+ $end_datetime = $bar_offset ? time2str("%Y-%m-%d",
str2time($x->[$#$x]) + $bar_offset) : $x->[$#$x];
+ if ($end_datetime =~ /^([0-9]{4})-([0-9]{2})-([0-9]{2})$/) {
+ $end_yr = $1;
+ $end_time = &perlchartdir::chartTime($1, $2, $3);
+ }
+ $chart->xAxis()->setDateScale($begin_time, $end_time);
+ my (@x_date);
+ for (my $i = 0; $i <= $#$x; $i++) {
+ if ($x->[$i] =~ /^([0-9]{4})-([0-9]{2})-([0-9]{2})$/) {
+ $x_date[$i] = &perlchartdir::chartTime($1, $2, $3);
+ }
+ else {
+ $x_date[$i] = $perlchartdir::NoValue;
+ }
+ }
+ $x_title .= " " if ($x_title);
+ $x_title .= "($begin_yr";
+ $x_title .= "-$end_yr" if ($end_yr ne $begin_yr);
+ $x_title .= ")";
+ $chart->xAxis()->setLabelFormat("{value|mm/dd}");
+ $layer->setXData([EMAIL PROTECTED]);
+ }
+ elsif ($x->[0] =~ /^[0-9]+$/) {
+ $layer->setXData($x);
+ }
+ else {
+ $chart->xAxis()->setLabels($x);
+ }
+ }
+ if ($spec->{graphtype} ne "pie" && $spec->{graphtype} ne "meter") {
+ $chart->xAxis()->setTitle($x_title) if ($x_title);
+ }
+}
+
sub write_line_graph_image {
&App::sub_entry if ($App::trace);
my ($self, $spec) = @_;
@@ -511,6 +529,9 @@
$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);
}
@@ -621,6 +642,7 @@
$value = $y_max if ($value > $y_max);
$value = 0 if ($value < 0);
$c->addPointer($value, 0x40666699, 0x0);
+ $c->xAxis()->setLabels($x);
$c->makeChart($spec->{image_path});
&App::sub_exit() if ($App::trace);
}
@@ -631,12 +653,12 @@
my $c = $self->new_pie_chart($spec);
my $x = $self->get_x($spec);
my $yn = $self->get_y($spec);
+ my $y = $yn->[0];
if ($#$yn > 0) {
}
- else {
- }
- $c->setData($yn->[0], $x);
+ $c->setData($y, $x);
$c->set3D() if ($spec->{"3D"});
+ $c->xAxis()->setLabels($x);
$c->makeChart($spec->{image_path});
&App::sub_exit() if ($App::trace);
}