Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw

Re^4: Parsing an SQL table using an array of hashes?

by chareTX (Initiate)
on Jul 02, 2013 at 19:50 UTC ( #1042088=note: print w/replies, xml ) Need Help??

in reply to Re^3: Parsing an SQL table using an array of hashes?
in thread Parsing an SQL table using an array of hashes?

So, thanks for the excellent example. But, I now need to do it the other way. instead of having the categories in the legend, i need the categories on the x-axis and the periods in the legend. I think I can do that with the code you provided, but honestly, we are getting to the edge of my PERL knowledge.

  • Comment on Re^4: Parsing an SQL table using an array of hashes?

Replies are listed 'Best First'.
Re^5: Parsing an SQL table using an array of hashes?
by poj (Monsignor) on Jul 02, 2013 at 20:52 UTC
    Little more complicated because you have to define an order for the categories, I have chosen a alphabetic sort.
    #perl use strict; use GD::Graph; use GD::Graph::bars; my $YEAR1 = 2013; my @period=(); my %y_data=(); my @x_legend=(); my %x_data=(); # store data while (<DATA>){ chomp; my ($m,$y,$cat,$n) = split ',',$_; # convert year/month to period number my $pd = ym_to_pd($y,$m); $period[$pd] = "$m/$y"; $y_data{$cat}[$pd] = $n; ++$x_data{$pd}; } # graph data my @y_plotdata; my @categories = sort keys %y_data; push @y_plotdata,[@categories]; for my $pd (sort {$a<=>$b} keys %x_data){ push @x_legend,$period[$pd]; my @y_data=(); for my $cat (@categories){ push @y_data,$y_data{$cat}[$pd]; } push @y_plotdata,[ @y_data ]; } # create graph my $my_graph = GD::Graph::bars->new(800,600); $my_graph->set( x_label => 'X Label', y_label => 'Y label', title => 'Title', ); $my_graph->set_legend(@x_legend); my $img = $my_graph->plot(\@y_plotdata) or die $my_graph->error; # save image open(IMG,'>','plot.gif') or die "$!"; binmode IMG; print IMG $img->png; close IMG; # convert year,month to period sub ym_to_pd { my ($yr,$mth) = @_; return ($yr - $YEAR1) * 12 + $mth; } # convert period to year.month sub pd_to_ym { my $ix = shift; my $yr = int(($ix-1)/12)+$YEAR1; my $mth = $ix-12*($yr-$YEAR1); return ($yr,$mth); } #test_periods(); sub test_periods { for my $y (2013..2015){ for my $m (1..12){ my $pd = ym_to_pd($y,$m); my ($yr,$mth) = pd_to_ym($pd); print "$y $m => $pd => $yr $mth\n"; } } } __DATA__ 3,2013,Address,1 2,2013,Equipment,13 3,2013,Equipment,18 4,2013,Equipment,17 5,2013,Equipment,8 3,2013,Database Reconciliation,3 5,2013,Database Reconciliation,3 2,2013,Design/Process,123 3,2013,Design/Process,74 4,2013,Design/Process,42 5,2013,Design/Process,30 1,2014,Design/Process,30
    Updated : period loop uses new %x_data :
    for my $pd (sort {$a<=>$b} keys %x_data){ push @x_legend,$period[$pd];

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1042088]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others browsing the Monastery: (4)
As of 2018-08-17 18:39 GMT
Find Nodes?
    Voting Booth?
    Asked to put a square peg in a round hole, I would:

    Results (182 votes). Check out past polls.