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>


Reply via email to