theravadamonk has asked for the wisdom of the Perl Monks concerning the following question:
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?
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: hbar or bar chart for my top 20 mail users with GD::Graph::hbars or GD::Graph::bars
by hippo (Archbishop) on Aug 07, 2018 at 11:29 UTC | |
by theravadamonk (Scribe) on Aug 08, 2018 at 09:17 UTC | |
by hippo (Archbishop) on Aug 08, 2018 at 09:52 UTC |