in reply to Re^2: GD::GRAPH:linespoints problem
in thread GD::GRAPH:linespoints problem

use strict; use warnings; use GD::Graph::linespoints; my $i = 0; while (<>) { my $g = GD::Graph::linespoints->new(100,100); $g->set( x_label => 'X Label', y_label => 'Y label', title => 'Some simple graph', y_max_value => 8, y_tick_number => 8, y_label_skip => 2 ) or die $g->error; my @line = split / /; open F,">plot$i.png" or die $!; binmode F; my $img = $g->plot( [[ 1, 2, 3, 4], \@line] ) or die $g->error; print F $img->png; $i++ }
Not that it makes any difference; as I suggested before the bug is in YOUR code, not in whatever I make up.

Replies are listed 'Best First'.
Re^4: GD::GRAPH:linespoints problem
by v_d_g (Initiate) on Mar 03, 2007 at 09:03 UTC
    okay, perhaps you can help me identify the bug using the following file:
    Start comments 1 2 3 4 5 6 7 8 quotes End Start comments 8 7 6 5 4 3 2 1 quotes End
    and the following code (excuse the poor quality)

    use GD::Graph::linespoints; my $data_file = "retestfileIN.txt"; open DATA, "$data_file" or die "can't open $data_file $!"; undef $/; $_ = <DATA>; close DATA; $/ = "\n"; for my $r (0 .. 1) { if (/comments(.*?)quotes/sg) { my $tempvar = $1; $tempvar=~ s/^\s+|\s+$//g; @alltemp = split(/\n/,$tempvar); foreach my $line (@alltemp) { $line =~ /(\d)\s(.*)/g; push(@first, $1); push(@second, $2); push (@data, ([@first, @second])); } } my $g = GD::Graph::linespoints->new(500,300); # graph code $g->set( x_label => 'X Label', y_label => 'Y label', title => 'Some simple graph', y_max_value => 10, y_tick_number => 8, y_label_skip => 2 ) or die $g->error; my $format = $g->export_format; open (IMG, ">squot$r.$format") or die $!; binmode IMG; print IMG $g->plot(\@data)->$format(); # end graph code }
    If I include the code for the graph, the IF never makes it to the second set of data (8 7, 6 5, 4 3, 2 1)

    there's my problem

      I think the reason that the graph is not quite right is that you are appending to @data on each pass through the loop, but you don't reinitialize it, so on the second pass @data has both sets of data in it. I assume that GD is ignoring the extra set.

      I would suggest that you do all of the following as a matter of course:

      (1) use warnings;

      (2) use strict;

      (3) add "my" where needed to declare variables in the correct scope (you won't need to explicitly reinitialize @data if it is made local to the loop), and finally

      (4) run the script "perltidy" from the CPAN module Perl::Tidy on your code to fix the indentation. This isn't just esthetic, it can make flaws in scoping and nesting a lot more obvious. (Update: a better description of using command-line perltidy is at http://perltidy.sourceforge.net/.)