Hi Monks,

I want to have a hbar or bar chart for my top 20 mail users with GD::Graph::hbars or GD::Graph::bars

My ultimate goal is to have a STACK bar chart since I have top 20 senders and recipients.

I have 2 files /tmp/senders.txt and /tmp/recipients.txt.

Let's first discuss one file. this time /tmp/senders.txt

DATA of /tmp/senders.txt

__DATA__ sender@domain1.com sender@domain2.com noreply@domain1.com noreply@domain1.com sender@domain1.com noreply@domain1.com

According to the above file ( Remember, This is just a sample file. Real file may contain about 1000 lines )

sender@domain1.com has 2 mails

sender@domain2.com has 1 mail

noreply@domain1.com has 3 mails

It reads it from start to end. when there are duplicates, It counts one by one.

This is the code for it

my $logfile = '/tmp/senders.txt'; open my $fh, '<', $logfile or die "Could not open $logfile : $!"; my %count=(); while (my $line = <$fh>) { foreach my $word (split /\s+/, $line) { ++$count{$word}; #print "$word\n"; #print "$count{$word}\n"; #print "<br />"; #print " \n"; } } for my $word ( (sort { $count{$b} <=> $count{$a} } keys %count) [0..1 +9] ) { #print "$word $count{$word}\n"; # THIS shows top 20 emails addres +s and its count. } close $fh;

Now What I need is to draw a hbar or bar chart with top 20 email addresses and their counts.

I have lost with below code? Could you pls correct me to go ahead.. ?

my @word = map{ $count{$_} || 0 } qw($word); my @count_word = map{ $count{$_} || 0 } qw($count{$word}); my $data = GD::Graph::Data->new([ [@word], [@count_word], ]) or die GD::Graph::Data->error;

Here's the full code

#!/usr/bin/perl use CGI ':standard'; use strict; use warnings; use GD::Graph; use GD::Graph::hbars; my $logfile = '/tmp/senders.txt'; open my $fh, '<', $logfile or die "Could not open $logfile : $!"; my %count=(); while (my $line = <$fh>) { foreach my $word (split /\s+/, $line) { ++$count{$word}; #print "$word\n"; #print "$count{$word}\n"; #print "<br />"; #print " \n"; } } for my $word ( (sort { $count{$b} <=> $count{$a} } keys %count) [0..1 +9] ) { #print "$word $count{$word}\n"; } close $fh; my @word = map{ $count{$_} || 0 } qw($word); #I think This is where I + have gone wring my @count_word = map{ $count{$_} || 0 } qw($count{$word}); # I think T +his is where I have gone wring my $data = GD::Graph::Data->new([ [@word], [@count_word], ]) or die GD::Graph::Data->error; my $graph = new GD::Graph::hbars(750,450); $graph->set( x_label => 'Email Users', x_label_position => 1/2, x_labels_vertical => 1, y_label => 'Count', title => 'Top Email Users', values_vertical => 0, show_values => 1, box_axis => 0 ); my $font = '/usr/share/fonts/gnu-freefont_freesans/FreeSans.ttf'; #my $font = '/usr/share/fonts/dejavu/DejaVuSans.ttf'; $graph->set_title_font($font,14); $graph->set_values_font($font, 8); $graph->set_x_axis_font($font,8); $graph->set_y_axis_font($font,8); $graph->set_legend_font($font,8); $graph->set_x_label_font($font,12); $graph->set_y_label_font($font,12); print header('image/png'); $graph->plot($data) or die $graph->error; binmode STDOUT; print $graph->gd->png;

Perl MONKS, Can correct my wrongdoing?


In reply to hbar or bar chart for my top 20 mail users with GD::Graph::hbars or GD::Graph::bars by theravadamonk

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.