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