The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;
use warnings;

use Date::Biorhythm;
use Date::Calc::Object qw(:all);
use SVG::Graph;
use SVG::Graph::Data;
use SVG::Graph::Data::Datum;

my $jb = Date::Biorhythm->new(
  {
    birthday => Date::Calc::Object->new(0, 1975, 12, 6),
    name     => 'JB',
  }
);

my $yy = Date::Biorhythm->new(
  {
    birthday => Date::Calc::Object->new(0, 1972, 1, 17),
    name     => 'YY',
  }
);



my $i     = 0;
my $limit = 90;
my $start_date = Date::Calc::Object->today;
my @jb;
my @yy;
$jb->day($start_date);
$yy->day($start_date);
while ($i < $limit) {
  push @jb, {
    day   => $jb->day,
    index => $i,
    map { $_ => $jb->value($_) } qw(emotional intellectual physical)
  };
  push @yy, {
    day   => $yy->day,
    index => $i,
    map { $_ => $yy->value($_) } qw(emotional intellectual physical)
  };
  $i++;
  $jb->next();
  $yy->next();
}

my @merged;
for ($i = 0; $i < @jb; $i++) {
  $merged[$i] = {
    day   => $jb[$i]{day},
    index => $i,
    (map { $_ => (($jb[$i]{$_} + $yy[$i]{$_}) / 2) } qw(emotional intellectual physical)),
    jb_emotional => $jb[$i]{emotional},
    yy_emotional  => $yy[$i]{emotional},
  }
}

use IO::All;
use Data::Dump qw(dump);
io('merged.pl') < dump(\@merged);

my @color_sets = (
  {
    emotional    => '#88ccff',
    intellectual => '#4488ff',
    physical     => '#2244ff',
  },
  {
    emotional    => '#ff88cc',
    intellectual => '#ff8844',
    physical     => '#ff4422',
  },
  {
    emotional    => '#ccffcc',
    intellectual => '#ccccff',
    physical     => '#ffcccc',
  },
  { },
);

my %color = %{ shift @color_sets };

my $graph = SVG::Graph->new(width => $limit * 20, height => 800, margin => 160);

my $did_axis = 0;

foreach my $person (\@jb, \@yy, \@merged) {
  foreach my $cycle (qw(emotional intellectual physical)) {
    my @datum = map { SVG::Graph::Data::Datum->new(x => $_->{index}, y => ($_->{$cycle}) * 10) } @$person;
    my $data = SVG::Graph::Data->new(data => \@datum);
    my $frame = $graph->add_frame();
    $frame->add_data($data);
    $frame->add_glyph(
      'axis' => (
        x_absolute_ticks => 1,
        y_absolute_ticks => 1,
        y_intercept      => 0,
        x_tick_labels    => [ map { my $d = $_->{day}; sprintf('%d/%02d/%02d', $d->year, $d->month, $d->day) } @$person ],
        y_tick_labels    => [ map { $_ * 10 } (-10 .. 10) ],
        stroke           => 'black',
        'stroke-width'   => 2,
      )
    ) unless ($did_axis);
    $did_axis++;

    $frame->add_glyph(
      'bezier' => (
        stroke         => $color{$cycle},
        fill           => $color{$cycle},
        'fill-opacity' => 0.50,
      )
    );
  }
  %color = %{ shift @color_sets };
}

#print the graphic
print $graph->draw;