1#!/usr/local/bin/perl
2use perlchartdir;
3use strict;
4
5my $filename;
6my $title;
7my $smaller=0;
8my $print=0;
9my $logScale=0;
10
11&init;
12
13my %labels;
14my (@max,@min,@avg,@firstQ,@thirdQ);
15while (<STDIN>) {
16	my ($k,$v);
17	chomp;
18	($k,$v)=split/,/;
19	if (($smaller>0) && ($smaller>$v)) { next; }
20	my @temp;
21	if (defined($labels{$k})){ @temp=@{$labels{$k}};}
22	push @temp,$v;
23	$labels{$k}=[ @temp ];
24}
25
26# calculate min,max,avg
27my @labelsA = sort {$a <=> $b} keys %labels;
28for my $key (@labelsA) {
29	my @values = @{$labels{$key}};
30	my $i=1;
31	my $sum=0;
32	#print "key: $key\n";
33	for my $value (sort {$a <=> $b} @values) {
34		#print "value: ".$value."\n";
35		$sum+=$value;
36		if ($i==1) {
37			#print STDERR "$value\n";
38			push (@min,$value);
39		}
40		if ($i==int($#values/4)+1) {
41			#print "$value\n";
42			push (@firstQ,$value);
43		}
44		if ($i==int($#values/4*3)+1) {
45			#print "$value\n";
46			push (@thirdQ,$value);
47		}
48		if ($i==int($#values/2)+1) {
49			#print "$value\n";
50			push (@avg,$value);
51		}
52		if ($i==$#values+1) {
53			#print STDERR "$value\n";
54			push (@max,$value);
55		}
56		$i++
57	}
58	my $avg=$sum/$i;
59	#print STDERR "$avg\n";
60
61}
62
63#if ($topN>0) {
64#@twoD = @twoD[0..$topN-1];
65#}
66
67#my @data = map $_->[ 1 ], @twoD;
68
69if ($print) {
70	print join("\n",@labelsA);
71}
72
73my $c = new XYChart(800, 800,0xffffff,-1,-1);
74$c->swapXY(1);
75$c->setPlotArea(200, 45, 650, 700, 0xffffff, -1, 0xffffff, $perlchartdir::Transparent, $perlchartdir::Transparent);
76$c->addTitle($title, "arialb.ttf", 14);
77$c->xAxis()->setLabels(\@labelsA);
78if ($logScale) {$c->yAxis()->setLogScale();}
79$c->xAxis()->setColors($perlchartdir::Transparent, 0);
80
81$c->addBoxWhiskerLayer(\@firstQ, \@thirdQ, \@max, \@min, \@avg, 0xAAAAAA,0x222222)->setLineWidth(2);
82
83#$layer->setBorderColor($perlchartdir::Transparent);
84#$layer->setBarGap(0.1);
85
86$c->makeChart($filename);
87
88exit;
89
90sub init() {
91    my %opt;
92    use Getopt::Std;
93    getopts("hlpf:n:t:", \%opt ) or usage();
94
95    # Help?
96    usage() if $opt{h};
97    $filename="boxplot.png";
98
99    $filename = $opt{f} if $opt{f};
100    $title = $opt{t} if $opt{t};
101    $smaller = $opt{n} if $opt{n};
102    $print = 1 if $opt{p};
103    $logScale = 1 if $opt{l};
104}
105
106sub usage() {
107
108    print STDERR << "EOF";
109
110Usage: cat file.csv | boxplot.pl [-hlp] -f outputfile [-t title] [-n value]");
111
112-f	     : output file name, ending in .PNG
113-h           : this (help) message
114-l	     : use log scale on y-axis
115-n           : only show the entries with x values smaller than x
116-p           : print the labels
117-t	     : chart title
118
119EOF
120    exit;
121}
122
123
124