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 Data::Dumper;
use SVG::Graph;
use SVG::Graph::Data;
use SVG::Graph::Data::Datum;

my @d1 = ();

my $head = <>;
chomp $head;
my @head = split /\t/, $head;
shift @head;

my ( $i, $j ) = ( 1, 1 );
while (<>) {
    chomp;
    my @cols = split /\t/;
    shift @cols;

    $j = 1;
    foreach my $c (@cols) {
        $c = int($c);
        $c = 200 if $c eq 'nan';

        #    $c = 200 if $c == 0;

        my $logc = log( $c > 0 ? $c : 0.000001 ) / log(2);

        #    $logc = 10 if $logc > 10;
        #    $logc = 3 if $logc < 3;
        $logc = undef if $c == 0;

        #warn $c , "\t", $logc;

        push @d1,
            SVG::Graph::Data::Datum->new( x => $j, y => $i, z => $logc );
        $j++;
    }

    $i++;
}

my $svg = SVG->new( width => 850, height => 850 );
my $graph = SVG::Graph->new(
    svg     => $svg,
    xoffset => 0,
    yoffset => 0,
    width   => 800,
    height  => 700,
    margin  => 30
);

my $frame0 = $graph->add_frame;
my $frame1 = $frame0->add_frame;

my $data1 = SVG::Graph::Data->new( data => \@d1 );

$frame1->add_data($data1);

$frame0->add_glyph(
    'axis',
    'stroke'           => 'black',
    'stroke-width'     => 2,
    'x_absolute_ticks' => 1,
    x_intertick_labels => \@head
);
$frame1->add_glyph(
    'heatmap',
    rgb_h => [ 255, 0,   0 ],
    rgb_m => [ 0,   0,   0 ],
    rgb_l => [ 0,   255, 0 ]
);

print $graph->draw;