App-Licensecheck
view release on metacpan or search on metacpan
t/devscripts/artistic-2-0-modules.pm view on Meta::CPAN
use SVG::Box;
enum SVG::Plot::AxisPosition <Zero SmallestValue LargestValue>;
unit class SVG::Plot;
has $.height = 300;
has $.width = 500;
has $.fill-width = 0.80;
has $.label-font-size = 12;
has $.legend-font-size = $!label-font-size;
has @.legends is rw;
has @.values is rw;
has @.x is rw; # only used in 'xy' variants
has @.labels is rw = @!values[0].keys;
has @.links is rw;
has $.plot-width = $!width * 0.80;
has $.plot-height = $!height * (@!legends ?? 0.5 !! 0.65);
has $.title = '';
has &.x-tick-step = -> $max {
10 ** $max.log10.floor / 2
}
has &.y-tick-step = -> $max {
10 ** $max.log10.floor / 2
}
has $.max-x-labels = $!plot-width / (1.5 * $!label-font-size);
has $.label-spacing = ($!height - $!plot-height) / 20;
has @.colors = <#3333ff #ffdd66 #aa2222 #228844 #eebb00 #8822bb>;
has $.min-y-axis = Inf;
multi method plot(:$full = True, :$stacked-bars!) {
my $label-skip = ceiling(@.values[0] / $.max-x-labels);
my $max_x = @.values[0].elems;
# maximum value of the sum over each column
my $max_y = [max] @.values[0].keys.map: {
[+] @.values.map: -> $a { $a[$_] }
};
my $datasets = +@.values;
my $step_x = $.plot-width / $max_x;
my $step_y = $.plot-height / $max_y;
my @svg_d = gather {
my $bar-width = $.fill-width * $step_x;
for flat @.values[0].keys Z @.labels -> $k, $l {
my $y-offset = 0;
for ^$datasets -> $d {
my $v = @.values[$d][$k];
my $p = 'rect' => [
:y(-$v * $step_y - $y-offset),
:x($k * $step_x),
:width($bar-width),
:height($v * $step_y),
:style("fill:{ @.colors[$d % *] }; stroke: none"),
];
$y-offset += $v * $step_y;
take |$.linkify($k, $p);
}
}
$.plot-x-labels(:$step_x, :$label-skip);
$.y-ticks(0, $max_y, $step_y);
}
my $svg = $.apply-standard-transform(
@svg_d,
@.eyecandy(),
);
( run in 1.848 second using v1.01-cache-2.11-cpan-39bf76dae61 )