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]
I managed to do it with this:
my (@data,@leg);
foreach my $code (keys %values) {
push @leg,$code;
my @temparray;
for (my $i = 0;$i <$no_years;++$i) {
push @temparray, $values{$code}[$i];
}
my @foo = reverse @temparray;
push @data,[EMAIL PROTECTED];
}
That's the best golf I can do. Seems a bit verbose but it works.
Dp.
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.
Cheers,
Rob
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);
open my $fh, '> plot.gif' or die $!;
binmode $fh;
print $fh $gd->gif;
close $fh;
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>