On 22 Nov 2006 at 17:35, Rob Dixon wrote:
> Beginner wrote:
> > On 22 Nov 2006 at 15:14, Beginner wrote:
> >>
> [snip]
> >>
> >> The number of years can vary so you might get data from 2006->1990.
> >>
> >> The data looks like it is suited to a hash but GD::lines wants the
> >> data passed to in as arrays references ([EMAIL PROTECTED]). That is one
> >> array
> >> with all the "ancode_n" and foreach code, an array of all the yearly
> >> values. I have managed to get my data into this type of structure
> >>
> >> 'ADV ' => [
> >> '117216',
> >> '104776',
> >> ]
> >> 'BAP ' => [
> >> '0',
> >> '270',
> >> ],
> >>
> >> But I am stuck trying to get it out into n number of arrays that I
> >> can pass to GD. I don't want to pre-declare n number of arrays as the
> >> number may vary and because I am using strict, I don't know how I can
> >> pass the data out of whatever loop I use to get to the values.
> [snip]
>
> OK that should work, you've got your codes into a list of legends now. There's
> no need for the reverse if you use unshift instead of push to add the values
> to
> the array. And what are you doing for a list of x-values (the years)?
>
> I understood you to mean that there may be gaps in the data, which is another
> reason why I said you needed to store hashes of data relating to the years. It
> also looked from your code like the data wasn't very well behaved, as you had
> allowed for a given year being repeated in some cases. If it's always complete
> and in reverse-year order then things are a lot easier. This program keeps
> your
> original data format and produces the same output as my previous effort.
>
>
> use strict;
> use warnings;
>
> use GD::Graph::lines;
> use CGI qw/:standard/;
>
> my $q = new CGI;
>
> my %years;
> my %values;
>
> foreach my $par ($q->param) {
>
> my $val = $q->param($par);
> $val =~ s/\s+$//;
>
> if ($par =~ /(\w{3})_(\d{4})/ ) {
> my ($ancode, $yr) = ($1, $2);
> $years{$yr}++;
> unshift @{$values{$ancode}}, $val;
> }
> }
>
> my @ancodes = sort keys %values;
> my $gdata = [
> [sort keys %years],
> @[EMAIL PROTECTED],
> ];
>
> my $graph = GD::Graph::lines->new(600, 400);
> $graph->set_legend(@ancodes);
> my $gd = $graph->plot($gdata);
>
I have come unstuck. I showed the results to the MD and he said
"perhaps it would look better if all the years were sorted" ,highest
to lowest based on the current year. So i began tinkering with Rob's
last post so I had a hash with the keys as the ancode (ADV) and their
values are a hash of the years and their values. It looks a bit like
this:
$VAR1 = {
'ADV' => {,
'2005' => '104776',
'2004' => '85515',
'2006' => '117619',
'2003' => '117007',
},
'PRO' => {,
'2005' => '49684',
'2004' => '39446',
'2006' => '49876',
'2003' => '45674',
},
which I got with this
use strict;
use warnings;
..snip
my $current_year;
my $year_counter = 0;
foreach my $par ($q->param) {
++$year_counter;
my $val = $q->param($par);
$val =~ s/\s+$//;
if ($par =~ /(\w{3})_(\d{4})/ ) {
my ($ancode, $yr) = ($1, $2);
($current_year) = $yr if ($year_counter == 2 ); # current year is
always 2nd param.
$values{$ancode}{$yr} = $val;
}
}
print STDERR "Current year is $current_year\n";
So I need to sort all the code values based on 2006 and then output
the codes in that order.
This seems to sort all the codes in order based on 2006:
my @ancodes = keys %values;
my @sorted_crnt_year = sort { $values{$a}{$current_year} <=>
$values{$b}{$current_year} } @ancodes;
What I can work out of how to pass the data to GD::Graph::Data. What
I have at the moment gives me all the values for a given code
together, rather than separated by years.
my $gdata = new GD::Graph::Data;
foreach my $code (@sorted_crnt_year) {
foreach my $y (keys %years) {
print STDERR "Code=$code,YR=$y,
Val=",$values{$code}{$y},"\n";
$gdata->add_point($code,$values{$code}{$y});
}
}
Can anyone help me with mapping the add_point so that the data is
segragated into years, but keeping the order of @sorted_crnt_year?
TIA.
Dp.
========= As it stands ===========
use strict;
use warnings;
use GD::Graph::bars;
use GD::Graph::Data;
use CGI qw/:standard/;
use Data::Dumper;
my $q = new CGI;
my %values;
my %years;
my $values;
my @param_names = $q->param;
my $current_year;
my $year_counter = 0;
foreach my $par ($q->param) {
++$year_counter;
my $val = $q->param($par);
$val =~ s/\s+$//;
if ($par =~ /(\w{3})_(\d{4})/ ) {
my ($ancode, $yr) = ($1, $2);
($current_year) = $yr if ($year_counter == 2 );
$years{$yr}++;
$values{$ancode}{$yr} = $val;
}
}
print STDERR "Current year is $current_year\n";
my @ancodes = sort keys %values;
# Sort the values of the current year nad store the code
my @sorted_crnt_year = sort { $values{$b}{$current_year} <=>
$values{$a}{$current_year} } @ancodes;
my $gdata = new GD::Graph::Data;
foreach my $code (@sorted_crnt_year) {
foreach my $y (keys %years) {
print STDERR "Code=$code,YR=$y,
Val=",$values{$code}{$y},"\n";
$gdata->add_point($code,$values{$code}{$y});
}
}
#open my $fh, '> plot.gif' or die $!;
#binmode $fh;
#print $fh $gd->gif;
#close $fh;
my $format = $graph->export_format;
print header("image/$format");
binmode STDOUT;
print $graph->plot($gdata)->$format or die $graph->error;
======================
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>