... use Imager; # OPEN FILE my $fn = 'datafile.dat'; open my $fh, '<', $fn or die "$fn $!"; # READ DATA INTO 2D MATRIX my @matrix = map [ qw(-1) x 40 ], 1..40; $matrix[$_->[1]][$_->[0]] = $_->[2] for map [split /\s+/ ], <$fh>; # PREPARE IMAGE my $scale=10; my $img = Imager->new(xsize=>40*$scale, ysize=>40*$scale, channels=>3); $img->box(filled=>1, color=>'#FFFFFF'); # CREATE IMAGE for my $row (0 .. @matrix-1) { for my $col (0 .. @{$matrix[$row]}-1) { my $val = $matrix[$row][$col]; next if $val == -1; # SELECT APPROPRIATE COLOR (BE CREATIVE HERE ;-) $img->box( color=>[ ($val/10)*25, $val*2.5, $val ], filled=>1, xmin=>$col*$scale, ymin=>$row*$scale, xmax=>($col+1)*$scale, ymax=>($row+1)*$scale ) } } # DUMP IMAGE TO FILE $img->write(file=>'my.jpg', jpegquality=>90) or die $img->errstr; ...