#!/usr/bin/perl use strict; use Statistics::Descriptive; use SVG::Graph; use SVG::Graph::Data; use SVG::Graph::Data::Datum; my %stat; my $graph = SVG::Graph->new(width => 1000, height => 800, margin => 40); my $parentgroup = $graph->add_group; my $statgroup = $parentgroup->add_group; my $bargroup = $parentgroup->add_group; my @data; my $ymax = undef; my $stat = Statistics::Descriptive::Full->new; while(<>){ chomp; if(/^#stat:/){ process_stat($_); next; } my($x,$y) = split /\s+/; $ymax = $y > $ymax ? $y : $ymax; $stat->add_data($x); push @data, SVG::Graph::Data::Datum->new(x => $x , y => $y); } $parentgroup->add_glyph('axis'); warn $stat{mean}; my @statdata = ( SVG::Graph::Data::Datum->new(x => $stat->min, y => 0), # SVG::Graph::Data::Datum->new(x => $stat{mean}, y => $ymax), # SVG::Graph::Data::Datum->new(x => $stat{mean} - $stat{standard_deviation}, y => $ymax), # SVG::Graph::Data::Datum->new(x => $stat{mean} + $stat{standard_deviation}, y => 0), SVG::Graph::Data::Datum->new(x => $stat{median}, y => $ymax), SVG::Graph::Data::Datum->new(x => $stat{quartile1}, y => $ymax), SVG::Graph::Data::Datum->new(x => $stat{quartile3}, y => 0), SVG::Graph::Data::Datum->new(x => $stat->max, y => 0), ); $statgroup->add_data(SVG::Graph::Data->new(data => \@statdata)); $statgroup->add_glyph('barflex', 'stroke' => 'black', 'fill' => 'black', 'stroke-opacity' => 1.0, 'fill-opacity' => 0.4 ); $bargroup->add_data(SVG::Graph::Data->new(data => \@data)); $bargroup->add_glyph('bar', 'stroke' => 'red', 'fill' => 'red', 'stroke-opacity' => 1.0, 'fill-opacity' => 0.8 ); print $graph->draw; sub process_stat { my $line = shift; my($name,$value) = $line =~ /^#stat:(\S+)\t(\S+)$/; $stat{$name} = $value; }