A stemplot is a form of histogram (see
Simple Text Histogram) used to display numerical data.
This function will display a stemplot for the numerical data
provided. It is intended for use on an Xterm or equivalent, and so
should not have large data sets passed to it.
#!/usr/bin/perl
use strict;
use diagnostics;
use POSIX;
sub stemplot {
my $p = shift;
my @sortedData = sort { $a <=> $b } @$p;
my $div = 10 ** (floor log10 $sortedData[ int ($#sortedData / 2)]);
my $range = $sortedData[-1] - $sortedData[0];
if (($range / $div) < 5.0) {
$div /= 10;
}
elsif (($range / $div) > 35.0) {
$div *= 10;
}
my @dataTo1DecimalPlace = map { sprintf "%.1f", ($_ / $div) } @sorte
+dData;
my %leaves;
foreach (@dataTo1DecimalPlace) {
my $stem = floor $_;
$leaves{$stem} .= sprintf "%1.0f", 10 * ($_ - $stem);
}
my $minStem = floor $dataTo1DecimalPlace[0];
my $maxStem = floor $dataTo1DecimalPlace[-1];
print "key: 10 stem = ", 10 * $div, " data\n";
foreach ($minStem .. $maxStem) {
printf "%3d: %s\n", $_, defined $leaves{$_} ? $leaves{$_} : "";
}
print "\n";
}